diff --git a/404.html b/404.html new file mode 100644 index 0000000000..ca0d650a7f --- /dev/null +++ b/404.html @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Bevy Engine + + + +
+ +
+
+ + +
+ +
+ + Features + +
+
+ + + +
+
+
+
+ + +
+

404

+

Sorry, we couldn't find that page.

+ Bevy logo +
+ +
+
+
+ + + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000000..9bb454511a --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +bevyengine.org \ No newline at end of file diff --git a/assets.js b/assets.js new file mode 100644 index 0000000000..77031d1bd9 --- /dev/null +++ b/assets.js @@ -0,0 +1,39 @@ +const searchElement = document.querySelector('#assets-search') + +searchElement.addEventListener("input", (_) => { + filterSearchTerms() + hideEmptySubSections() + hideEmptySections() +}) + +function filterSearchTerms() { + const searchTerms = searchElement.value.toLowerCase().split(' ') + for (const asset of document.querySelectorAll('.asset-card')) { + const fullText = asset.text.toLowerCase() + const searchMatch = searchTerms.every((term) => fullText.includes(term)) + asset.parentElement.style.display = searchMatch ? 'block' : 'none' + } +} + +function hideEmptySubSections() { + for (const itemGrid of document.querySelectorAll('.item-grid')) { + const cardInGrid = [...itemGrid.querySelectorAll('.asset-card')] + const areAllHidden = (cardInGrid.every((card) => card.parentElement.style.display === 'none')) + itemGrid.style.display = areAllHidden ? 'none' : 'grid' + itemGrid.previousElementSibling.style.display = areAllHidden ? 'none' : 'block' + } +} + +function hideEmptySections() { + document.querySelectorAll('.asset-section').forEach(section => { + let nextElement = section.nextElementSibling + while (nextElement && !nextElement.classList.contains('asset-section')) { + if (nextElement.style.display !== 'none') { + section.style.display = 'block' + return + } + nextElement = nextElement.nextElementSibling + } + section.style.display = 'none' + }) +} \ No newline at end of file diff --git a/assets/Encultured.png b/assets/Encultured.png new file mode 100644 index 0000000000..fe94cca65e Binary files /dev/null and b/assets/Encultured.png differ diff --git a/assets/Foresight_Mining_Software_Corporation.png b/assets/Foresight_Mining_Software_Corporation.png new file mode 100644 index 0000000000..0b38fce153 Binary files /dev/null and b/assets/Foresight_Mining_Software_Corporation.png differ diff --git a/assets/Futurewei.png b/assets/Futurewei.png new file mode 100644 index 0000000000..936fa220d7 Binary files /dev/null and b/assets/Futurewei.png differ diff --git a/assets/LegionLabs.png b/assets/LegionLabs.png new file mode 100644 index 0000000000..b8fcfbb12e Binary files /dev/null and b/assets/LegionLabs.png differ diff --git a/assets/VPSServer.png b/assets/VPSServer.png new file mode 100644 index 0000000000..4a3cbfea29 Binary files /dev/null and b/assets/VPSServer.png differ diff --git a/assets/Wunder_Software_GmbH.png b/assets/Wunder_Software_GmbH.png new file mode 100644 index 0000000000..ec149dbccd Binary files /dev/null and b/assets/Wunder_Software_GmbH.png differ diff --git a/assets/agile_perception.png b/assets/agile_perception.png new file mode 100644 index 0000000000..c1e68f5552 Binary files /dev/null and b/assets/agile_perception.png differ diff --git a/assets/apps/games/2048-game/index.html b/assets/apps/games/2048-game/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/2048-game/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/2048.jpg b/assets/apps/games/2048.jpg new file mode 100644 index 0000000000..8904589922 Binary files /dev/null and b/assets/apps/games/2048.jpg differ diff --git a/assets/apps/games/Hug.png b/assets/apps/games/Hug.png new file mode 100644 index 0000000000..98c745403e Binary files /dev/null and b/assets/apps/games/Hug.png differ diff --git a/assets/apps/games/Kataster.webp b/assets/apps/games/Kataster.webp new file mode 100644 index 0000000000..04c282361d Binary files /dev/null and b/assets/apps/games/Kataster.webp differ diff --git a/assets/apps/games/One-Click-Ninja.png b/assets/apps/games/One-Click-Ninja.png new file mode 100644 index 0000000000..6cc0d6f0b4 Binary files /dev/null and b/assets/apps/games/One-Click-Ninja.png differ diff --git a/assets/apps/games/another-snake-game/index.html b/assets/apps/games/another-snake-game/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/another-snake-game/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/arugio/index.html b/assets/apps/games/arugio/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/arugio/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/ascii-bomb-ecs.gif b/assets/apps/games/ascii-bomb-ecs.gif new file mode 100644 index 0000000000..5048e88e26 Binary files /dev/null and b/assets/apps/games/ascii-bomb-ecs.gif differ diff --git a/assets/apps/games/ascii-bomb-ecs/index.html b/assets/apps/games/ascii-bomb-ecs/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/ascii-bomb-ecs/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/battle-city.png b/assets/apps/games/battle-city.png new file mode 100644 index 0000000000..cc9560f0dd Binary files /dev/null and b/assets/apps/games/battle-city.png differ diff --git a/assets/apps/games/battle-city/index.html b/assets/apps/games/battle-city/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/battle-city/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bavy-balls.png b/assets/apps/games/bavy-balls.png new file mode 100644 index 0000000000..04594cc7a2 Binary files /dev/null and b/assets/apps/games/bavy-balls.png differ diff --git a/assets/apps/games/bavy-balls/index.html b/assets/apps/games/bavy-balls/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bavy-balls/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bevy-combat/index.html b/assets/apps/games/bevy-combat/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bevy-combat/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bevy-pong/index.html b/assets/apps/games/bevy-pong/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bevy-pong/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bevy-rider/index.html b/assets/apps/games/bevy-rider/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bevy-rider/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bevy-rust-wasm-experiments/index.html b/assets/apps/games/bevy-rust-wasm-experiments/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bevy-rust-wasm-experiments/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bevy-shoot-em-up.png b/assets/apps/games/bevy-shoot-em-up.png new file mode 100644 index 0000000000..f161babd63 Binary files /dev/null and b/assets/apps/games/bevy-shoot-em-up.png differ diff --git a/assets/apps/games/bevy-shoot-em-up/index.html b/assets/apps/games/bevy-shoot-em-up/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bevy-shoot-em-up/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bevy-sokoban/index.html b/assets/apps/games/bevy-sokoban/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bevy-sokoban/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bevy-space-invaders/index.html b/assets/apps/games/bevy-space-invaders/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bevy-space-invaders/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bevy-squares/index.html b/assets/apps/games/bevy-squares/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bevy-squares/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bevy-tetris-0.6.png b/assets/apps/games/bevy-tetris-0.6.png new file mode 100644 index 0000000000..6058e7997f Binary files /dev/null and b/assets/apps/games/bevy-tetris-0.6.png differ diff --git a/assets/apps/games/bevy-tetris-yat.gif b/assets/apps/games/bevy-tetris-yat.gif new file mode 100644 index 0000000000..7b15347bba Binary files /dev/null and b/assets/apps/games/bevy-tetris-yat.gif differ diff --git a/assets/apps/games/bevy-tetris/index.html b/assets/apps/games/bevy-tetris/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bevy-tetris/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bevy_combat.gif b/assets/apps/games/bevy_combat.gif new file mode 100644 index 0000000000..7b630ff0a6 Binary files /dev/null and b/assets/apps/games/bevy_combat.gif differ diff --git a/assets/apps/games/bevy_pixel_attack.gif b/assets/apps/games/bevy_pixel_attack.gif new file mode 100644 index 0000000000..9921393380 Binary files /dev/null and b/assets/apps/games/bevy_pixel_attack.gif differ diff --git a/assets/apps/games/bevy_rust_wasm_experiments.webp b/assets/apps/games/bevy_rust_wasm_experiments.webp new file mode 100644 index 0000000000..3020a51720 Binary files /dev/null and b/assets/apps/games/bevy_rust_wasm_experiments.webp differ diff --git a/assets/apps/games/bong/index.html b/assets/apps/games/bong/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bong/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/bounce-up.png b/assets/apps/games/bounce-up.png new file mode 100644 index 0000000000..d27c171063 Binary files /dev/null and b/assets/apps/games/bounce-up.png differ diff --git a/assets/apps/games/bounce-up/index.html b/assets/apps/games/bounce-up/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/bounce-up/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/build-a-better-buddy/index.html b/assets/apps/games/build-a-better-buddy/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/build-a-better-buddy/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/build_a_better_buddy.png b/assets/apps/games/build_a_better_buddy.png new file mode 100644 index 0000000000..6ffeced3e6 Binary files /dev/null and b/assets/apps/games/build_a_better_buddy.png differ diff --git a/assets/apps/games/cheaters-never-win.png b/assets/apps/games/cheaters-never-win.png new file mode 100644 index 0000000000..02c5841714 Binary files /dev/null and b/assets/apps/games/cheaters-never-win.png differ diff --git a/assets/apps/games/cheaters-never-win/index.html b/assets/apps/games/cheaters-never-win/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/cheaters-never-win/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/colonize/index.html b/assets/apps/games/colonize/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/colonize/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/combine-racers.png b/assets/apps/games/combine-racers.png new file mode 100644 index 0000000000..9604f5947e Binary files /dev/null and b/assets/apps/games/combine-racers.png differ diff --git a/assets/apps/games/combine-racers/index.html b/assets/apps/games/combine-racers/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/combine-racers/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/cube-collection.gif b/assets/apps/games/cube-collection.gif new file mode 100644 index 0000000000..18293aab2a Binary files /dev/null and b/assets/apps/games/cube-collection.gif differ diff --git a/assets/apps/games/cube-collection/index.html b/assets/apps/games/cube-collection/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/cube-collection/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/digital-extinction.png b/assets/apps/games/digital-extinction.png new file mode 100644 index 0000000000..1cdf7bd6a7 Binary files /dev/null and b/assets/apps/games/digital-extinction.png differ diff --git a/assets/apps/games/digital-extinction/index.html b/assets/apps/games/digital-extinction/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/digital-extinction/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/dodge-the-creeps-bevy.png b/assets/apps/games/dodge-the-creeps-bevy.png new file mode 100644 index 0000000000..a11803ee8b Binary files /dev/null and b/assets/apps/games/dodge-the-creeps-bevy.png differ diff --git a/assets/apps/games/dodge-the-creeps/index.html b/assets/apps/games/dodge-the-creeps/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/dodge-the-creeps/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/drone-agility-challenge.gif b/assets/apps/games/drone-agility-challenge.gif new file mode 100644 index 0000000000..099d81826a Binary files /dev/null and b/assets/apps/games/drone-agility-challenge.gif differ diff --git a/assets/apps/games/drone-agility-challenge/index.html b/assets/apps/games/drone-agility-challenge/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/drone-agility-challenge/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/dungeon-quest-v2/index.html b/assets/apps/games/dungeon-quest-v2/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/dungeon-quest-v2/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/dungeon-quest.png b/assets/apps/games/dungeon-quest.png new file mode 100644 index 0000000000..b4fce3b4c2 Binary files /dev/null and b/assets/apps/games/dungeon-quest.png differ diff --git a/assets/apps/games/dungeon-quest/index.html b/assets/apps/games/dungeon-quest/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/dungeon-quest/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/fish-fight-punchy/index.html b/assets/apps/games/fish-fight-punchy/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/fish-fight-punchy/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/flappy-bevy/index.html b/assets/apps/games/flappy-bevy/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/flappy-bevy/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/flappy-bird/index.html b/assets/apps/games/flappy-bird/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/flappy-bird/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/flappy_bird.gif b/assets/apps/games/flappy_bird.gif new file mode 100644 index 0000000000..8ec7b1048c Binary files /dev/null and b/assets/apps/games/flappy_bird.gif differ diff --git a/assets/apps/games/flock-rs/index.html b/assets/apps/games/flock-rs/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/flock-rs/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/game-of-life.png b/assets/apps/games/game-of-life.png new file mode 100644 index 0000000000..8bfd605c2c Binary files /dev/null and b/assets/apps/games/game-of-life.png differ diff --git a/assets/apps/games/game-of-life/index.html b/assets/apps/games/game-of-life/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/game-of-life/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/i-sjon-kan-ingen-hora-dig-skrika/index.html b/assets/apps/games/i-sjon-kan-ingen-hora-dig-skrika/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/i-sjon-kan-ingen-hora-dig-skrika/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/index.html b/assets/apps/games/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/apps/games/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/jump-jump.jpg b/assets/apps/games/jump-jump.jpg new file mode 100644 index 0000000000..e7753887c6 Binary files /dev/null and b/assets/apps/games/jump-jump.jpg differ diff --git a/assets/apps/games/jump-jump/index.html b/assets/apps/games/jump-jump/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/jump-jump/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/kataster/index.html b/assets/apps/games/kataster/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/kataster/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/keep-inside/index.html b/assets/apps/games/keep-inside/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/keep-inside/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/keep-moving-and-nobody-burns/index.html b/assets/apps/games/keep-moving-and-nobody-burns/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/keep-moving-and-nobody-burns/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/labyrinth-game/index.html b/assets/apps/games/labyrinth-game/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/labyrinth-game/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/lewiszlw-tetris.png b/assets/apps/games/lewiszlw-tetris.png new file mode 100644 index 0000000000..25f155f006 Binary files /dev/null and b/assets/apps/games/lewiszlw-tetris.png differ diff --git a/assets/apps/games/libracity.png b/assets/apps/games/libracity.png new file mode 100644 index 0000000000..a749c54f87 Binary files /dev/null and b/assets/apps/games/libracity.png differ diff --git a/assets/apps/games/libracity/index.html b/assets/apps/games/libracity/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/libracity/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/limbo-pass/index.html b/assets/apps/games/limbo-pass/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/limbo-pass/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/limbo_pass.png b/assets/apps/games/limbo_pass.png new file mode 100644 index 0000000000..4a0b6f34dd Binary files /dev/null and b/assets/apps/games/limbo_pass.png differ diff --git a/assets/apps/games/mechaburro.gif b/assets/apps/games/mechaburro.gif new file mode 100644 index 0000000000..320c7707bf Binary files /dev/null and b/assets/apps/games/mechaburro.gif differ diff --git a/assets/apps/games/miam.png b/assets/apps/games/miam.png new file mode 100644 index 0000000000..1eb53b841b Binary files /dev/null and b/assets/apps/games/miam.png differ diff --git a/assets/apps/games/miam/index.html b/assets/apps/games/miam/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/miam/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/miner.png b/assets/apps/games/miner.png new file mode 100644 index 0000000000..a7c889b3c4 Binary files /dev/null and b/assets/apps/games/miner.png differ diff --git a/assets/apps/games/miner/index.html b/assets/apps/games/miner/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/miner/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/moon-creator/index.html b/assets/apps/games/moon-creator/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/moon-creator/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/murder-user-dungeon.png b/assets/apps/games/murder-user-dungeon.png new file mode 100644 index 0000000000..cd028e9bec Binary files /dev/null and b/assets/apps/games/murder-user-dungeon.png differ diff --git a/assets/apps/games/murder-user-dungeon/index.html b/assets/apps/games/murder-user-dungeon/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/murder-user-dungeon/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/nbody_moon_creator.gif b/assets/apps/games/nbody_moon_creator.gif new file mode 100644 index 0000000000..5aa96e4ae0 Binary files /dev/null and b/assets/apps/games/nbody_moon_creator.gif differ diff --git a/assets/apps/games/not-snake.png b/assets/apps/games/not-snake.png new file mode 100644 index 0000000000..62dd87ef9d Binary files /dev/null and b/assets/apps/games/not-snake.png differ diff --git a/assets/apps/games/not-snake/index.html b/assets/apps/games/not-snake/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/not-snake/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/oicana.png b/assets/apps/games/oicana.png new file mode 100644 index 0000000000..204737e29d Binary files /dev/null and b/assets/apps/games/oicana.png differ diff --git a/assets/apps/games/oicana/index.html b/assets/apps/games/oicana/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/oicana/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/one-click-ninja/index.html b/assets/apps/games/one-click-ninja/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/one-click-ninja/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/per-spatium/index.html b/assets/apps/games/per-spatium/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/per-spatium/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/pillars.png b/assets/apps/games/pillars.png new file mode 100644 index 0000000000..a04d3e3c1b Binary files /dev/null and b/assets/apps/games/pillars.png differ diff --git a/assets/apps/games/pillars/index.html b/assets/apps/games/pillars/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/pillars/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/pixel-attack/index.html b/assets/apps/games/pixel-attack/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/pixel-attack/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/pixie-wrangler.png b/assets/apps/games/pixie-wrangler.png new file mode 100644 index 0000000000..1a75dee646 Binary files /dev/null and b/assets/apps/games/pixie-wrangler.png differ diff --git a/assets/apps/games/pixie-wrangler/index.html b/assets/apps/games/pixie-wrangler/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/pixie-wrangler/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/projectris/index.html b/assets/apps/games/projectris/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/projectris/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/punchy.png b/assets/apps/games/punchy.png new file mode 100644 index 0000000000..40fc294295 Binary files /dev/null and b/assets/apps/games/punchy.png differ diff --git a/assets/apps/games/quien-es-el-mechaburro/index.html b/assets/apps/games/quien-es-el-mechaburro/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/quien-es-el-mechaburro/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/robbo/index.html b/assets/apps/games/robbo/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/robbo/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/rubiks-cube.jpg b/assets/apps/games/rubiks-cube.jpg new file mode 100644 index 0000000000..74f8e56f6b Binary files /dev/null and b/assets/apps/games/rubiks-cube.jpg differ diff --git a/assets/apps/games/rubiks-cube/index.html b/assets/apps/games/rubiks-cube/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/rubiks-cube/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/screen-ball.png b/assets/apps/games/screen-ball.png new file mode 100644 index 0000000000..0159481b75 Binary files /dev/null and b/assets/apps/games/screen-ball.png differ diff --git a/assets/apps/games/screen-ball/index.html b/assets/apps/games/screen-ball/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/screen-ball/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/sio2/index.html b/assets/apps/games/sio2/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/sio2/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/smoke-rs/index.html b/assets/apps/games/smoke-rs/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/smoke-rs/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/snake-bevy/index.html b/assets/apps/games/snake-bevy/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/snake-bevy/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/super-kaizen-overloaded.png b/assets/apps/games/super-kaizen-overloaded.png new file mode 100644 index 0000000000..3114836398 Binary files /dev/null and b/assets/apps/games/super-kaizen-overloaded.png differ diff --git a/assets/apps/games/super-kaizen-overloaded/index.html b/assets/apps/games/super-kaizen-overloaded/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/super-kaizen-overloaded/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/taileater.gif b/assets/apps/games/taileater.gif new file mode 100644 index 0000000000..e4edb793a7 Binary files /dev/null and b/assets/apps/games/taileater.gif differ diff --git a/assets/apps/games/taileater/index.html b/assets/apps/games/taileater/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/taileater/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/taipo.gif b/assets/apps/games/taipo.gif new file mode 100644 index 0000000000..9f3fefd042 Binary files /dev/null and b/assets/apps/games/taipo.gif differ diff --git a/assets/apps/games/taipo/index.html b/assets/apps/games/taipo/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/taipo/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/tetris-for-bevy-06-07/index.html b/assets/apps/games/tetris-for-bevy-06-07/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/tetris-for-bevy-06-07/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/tetris-for-bevy-yet-another/index.html b/assets/apps/games/tetris-for-bevy-yet-another/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/tetris-for-bevy-yet-another/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/tetris/index.html b/assets/apps/games/tetris/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/tetris/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/thallada-bevy-nbody/index.html b/assets/apps/games/thallada-bevy-nbody/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/thallada-bevy-nbody/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/the-hug-game/index.html b/assets/apps/games/the-hug-game/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/the-hug-game/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/theta-wave/index.html b/assets/apps/games/theta-wave/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/theta-wave/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/thetawave.png b/assets/apps/games/thetawave.png new file mode 100644 index 0000000000..e9aaa81a9b Binary files /dev/null and b/assets/apps/games/thetawave.png differ diff --git a/assets/apps/games/typey-birb.png b/assets/apps/games/typey-birb.png new file mode 100644 index 0000000000..6b5969aef4 Binary files /dev/null and b/assets/apps/games/typey-birb.png differ diff --git a/assets/apps/games/typey-birb/index.html b/assets/apps/games/typey-birb/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/typey-birb/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/unbalanced-brawl.png b/assets/apps/games/unbalanced-brawl.png new file mode 100644 index 0000000000..c9a85f9e15 Binary files /dev/null and b/assets/apps/games/unbalanced-brawl.png differ diff --git a/assets/apps/games/unbalanced-brawl/index.html b/assets/apps/games/unbalanced-brawl/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/unbalanced-brawl/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/unflock.png b/assets/apps/games/unflock.png new file mode 100644 index 0000000000..fed8989a33 Binary files /dev/null and b/assets/apps/games/unflock.png differ diff --git a/assets/apps/games/unflock/index.html b/assets/apps/games/unflock/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/unflock/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/warlocks-gambit.png b/assets/apps/games/warlocks-gambit.png new file mode 100644 index 0000000000..8886a99056 Binary files /dev/null and b/assets/apps/games/warlocks-gambit.png differ diff --git a/assets/apps/games/warlocks-gambit/index.html b/assets/apps/games/warlocks-gambit/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/warlocks-gambit/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/whoisdavid-bevy-nbody/index.html b/assets/apps/games/whoisdavid-bevy-nbody/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/whoisdavid-bevy-nbody/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/games/zenith/index.html b/assets/apps/games/zenith/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/games/zenith/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/index.html b/assets/apps/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/apps/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/tools/bevy-calc/index.html b/assets/apps/tools/bevy-calc/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/tools/bevy-calc/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/tools/fun-notation.gif b/assets/apps/tools/fun-notation.gif new file mode 100644 index 0000000000..409001f94d Binary files /dev/null and b/assets/apps/tools/fun-notation.gif differ diff --git a/assets/apps/tools/fun-notation/index.html b/assets/apps/tools/fun-notation/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/tools/fun-notation/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/tools/index.html b/assets/apps/tools/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/apps/tools/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/tools/lavagna.gif b/assets/apps/tools/lavagna.gif new file mode 100644 index 0000000000..6d528f15fb Binary files /dev/null and b/assets/apps/tools/lavagna.gif differ diff --git a/assets/apps/tools/lavagna/index.html b/assets/apps/tools/lavagna/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/tools/lavagna/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/tools/nodus.gif b/assets/apps/tools/nodus.gif new file mode 100644 index 0000000000..6df79be93b Binary files /dev/null and b/assets/apps/tools/nodus.gif differ diff --git a/assets/apps/tools/nodus/index.html b/assets/apps/tools/nodus/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/tools/nodus/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/apps/tools/velo.png b/assets/apps/tools/velo.png new file mode 100644 index 0000000000..32aed2d80a Binary files /dev/null and b/assets/apps/tools/velo.png differ diff --git a/assets/apps/tools/velo/index.html b/assets/apps/tools/velo/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/apps/tools/velo/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-earcutr/index.html b/assets/assets/2d/bevy-earcutr/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-earcutr/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-ecs-ldtk/index.html b/assets/assets/2d/bevy-ecs-ldtk/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-ecs-ldtk/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-ecs-tilemap/index.html b/assets/assets/2d/bevy-ecs-tilemap/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-ecs-tilemap/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-interact-2d/index.html b/assets/assets/2d/bevy-interact-2d/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-interact-2d/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-ldtk/index.html b/assets/assets/2d/bevy-ldtk/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-ldtk/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-life/index.html b/assets/assets/2d/bevy-life/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-life/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-pancam/index.html b/assets/assets/2d/bevy-pancam/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-pancam/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-paperdoll.gif b/assets/assets/2d/bevy-paperdoll.gif new file mode 100644 index 0000000000..489c7cf5f8 Binary files /dev/null and b/assets/assets/2d/bevy-paperdoll.gif differ diff --git a/assets/assets/2d/bevy-paperdoll/index.html b/assets/assets/2d/bevy-paperdoll/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-paperdoll/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-parallax.gif b/assets/assets/2d/bevy-parallax.gif new file mode 100644 index 0000000000..58f8064fe1 Binary files /dev/null and b/assets/assets/2d/bevy-parallax.gif differ diff --git a/assets/assets/2d/bevy-parallax/index.html b/assets/assets/2d/bevy-parallax/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-parallax/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-pixels/index.html b/assets/assets/2d/bevy-pixels/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-pixels/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-prototype-lyon/index.html b/assets/assets/2d/bevy-prototype-lyon/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-prototype-lyon/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-prototype-parallax/index.html b/assets/assets/2d/bevy-prototype-parallax/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-prototype-parallax/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-rapier-collider-gen/index.html b/assets/assets/2d/bevy-rapier-collider-gen/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-rapier-collider-gen/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-retro/index.html b/assets/assets/2d/bevy-retro/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-retro/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-text-mode/index.html b/assets/assets/2d/bevy-text-mode/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-text-mode/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-tiled/index.html b/assets/assets/2d/bevy-tiled/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-tiled/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-tilemap/index.html b/assets/assets/2d/bevy-tilemap/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-tilemap/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-tileset/index.html b/assets/assets/2d/bevy-tileset/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-tileset/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-tiling-background/index.html b/assets/assets/2d/bevy-tiling-background/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-tiling-background/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy-xml/index.html b/assets/assets/2d/bevy-xml/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/bevy-xml/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/bevy_ecs_ldtk.gif b/assets/assets/2d/bevy_ecs_ldtk.gif new file mode 100644 index 0000000000..448b2fd4a3 Binary files /dev/null and b/assets/assets/2d/bevy_ecs_ldtk.gif differ diff --git a/assets/assets/2d/bevy_life.png b/assets/assets/2d/bevy_life.png new file mode 100644 index 0000000000..0c7a26806a Binary files /dev/null and b/assets/assets/2d/bevy_life.png differ diff --git a/assets/assets/2d/bevy_rapier_collider_gen.png b/assets/assets/2d/bevy_rapier_collider_gen.png new file mode 100644 index 0000000000..e8a7dae810 Binary files /dev/null and b/assets/assets/2d/bevy_rapier_collider_gen.png differ diff --git a/assets/assets/2d/bevy_text_mode.png b/assets/assets/2d/bevy_text_mode.png new file mode 100644 index 0000000000..1c419e4ee6 Binary files /dev/null and b/assets/assets/2d/bevy_text_mode.png differ diff --git a/assets/assets/2d/bevy_tileset.gif b/assets/assets/2d/bevy_tileset.gif new file mode 100644 index 0000000000..f503fdf691 Binary files /dev/null and b/assets/assets/2d/bevy_tileset.gif differ diff --git a/assets/assets/2d/bevy_tiling_background.gif b/assets/assets/2d/bevy_tiling_background.gif new file mode 100644 index 0000000000..185358d58e Binary files /dev/null and b/assets/assets/2d/bevy_tiling_background.gif differ diff --git a/assets/assets/2d/bevy_xml.gif b/assets/assets/2d/bevy_xml.gif new file mode 100644 index 0000000000..5ba53a274c Binary files /dev/null and b/assets/assets/2d/bevy_xml.gif differ diff --git a/assets/assets/2d/index.html b/assets/assets/2d/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/2d/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/seldom-pixel/index.html b/assets/assets/2d/seldom-pixel/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/2d/seldom-pixel/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/2d/seldom_pixel.gif b/assets/assets/2d/seldom_pixel.gif new file mode 100644 index 0000000000..316d084b9c Binary files /dev/null and b/assets/assets/2d/seldom_pixel.gif differ diff --git a/assets/assets/3d/bevy-aabb-instancing/index.html b/assets/assets/3d/bevy-aabb-instancing/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-aabb-instancing/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-atmosphere/index.html b/assets/assets/3d/bevy-atmosphere/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-atmosphere/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-c3d/index.html b/assets/assets/3d/bevy-c3d/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-c3d/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-hanabi/index.html b/assets/assets/3d/bevy-hanabi/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-hanabi/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-hikari.png b/assets/assets/3d/bevy-hikari.png new file mode 100644 index 0000000000..00a67d6a7e Binary files /dev/null and b/assets/assets/3d/bevy-hikari.png differ diff --git a/assets/assets/3d/bevy-hikari/index.html b/assets/assets/3d/bevy-hikari/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-hikari/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-kajiya.png b/assets/assets/3d/bevy-kajiya.png new file mode 100644 index 0000000000..05fa274c3d Binary files /dev/null and b/assets/assets/3d/bevy-kajiya.png differ diff --git a/assets/assets/3d/bevy-kajiya/index.html b/assets/assets/3d/bevy-kajiya/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-kajiya/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-mod-outline/index.html b/assets/assets/3d/bevy-mod-outline/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-mod-outline/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-mod-picking/index.html b/assets/assets/3d/bevy-mod-picking/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-mod-picking/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-mod-raycast/index.html b/assets/assets/3d/bevy-mod-raycast/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-mod-raycast/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-obj/index.html b/assets/assets/3d/bevy-obj/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-obj/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-stl/index.html b/assets/assets/3d/bevy-stl/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-stl/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-toon-shader/index.html b/assets/assets/3d/bevy-toon-shader/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-toon-shader/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-transform-gizmo/index.html b/assets/assets/3d/bevy-transform-gizmo/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-transform-gizmo/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-vfx-bag/index.html b/assets/assets/3d/bevy-vfx-bag/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-vfx-bag/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-vox-mesh/index.html b/assets/assets/3d/bevy-vox-mesh/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-vox-mesh/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-vox/index.html b/assets/assets/3d/bevy-vox/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-vox/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy-water/index.html b/assets/assets/3d/bevy-water/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/bevy-water/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/bevy_aabb_instancing.png b/assets/assets/3d/bevy_aabb_instancing.png new file mode 100644 index 0000000000..84779265ee Binary files /dev/null and b/assets/assets/3d/bevy_aabb_instancing.png differ diff --git a/assets/assets/3d/bevy_c3d.gif b/assets/assets/3d/bevy_c3d.gif new file mode 100644 index 0000000000..2f42848fc1 Binary files /dev/null and b/assets/assets/3d/bevy_c3d.gif differ diff --git a/assets/assets/3d/bevy_hanabi.gif b/assets/assets/3d/bevy_hanabi.gif new file mode 100644 index 0000000000..522554b9a4 Binary files /dev/null and b/assets/assets/3d/bevy_hanabi.gif differ diff --git a/assets/assets/3d/bevy_mod_outline.png b/assets/assets/3d/bevy_mod_outline.png new file mode 100644 index 0000000000..934e262507 Binary files /dev/null and b/assets/assets/3d/bevy_mod_outline.png differ diff --git a/assets/assets/3d/bevy_mod_picking.png b/assets/assets/3d/bevy_mod_picking.png new file mode 100644 index 0000000000..ee98080af6 Binary files /dev/null and b/assets/assets/3d/bevy_mod_picking.png differ diff --git a/assets/assets/3d/bevy_mod_raycast.png b/assets/assets/3d/bevy_mod_raycast.png new file mode 100644 index 0000000000..7034e570ce Binary files /dev/null and b/assets/assets/3d/bevy_mod_raycast.png differ diff --git a/assets/assets/3d/bevy_toon_shader.jpg b/assets/assets/3d/bevy_toon_shader.jpg new file mode 100644 index 0000000000..86f199e5d6 Binary files /dev/null and b/assets/assets/3d/bevy_toon_shader.jpg differ diff --git a/assets/assets/3d/bevy_transform_gizmo.png b/assets/assets/3d/bevy_transform_gizmo.png new file mode 100644 index 0000000000..16edbbe7a7 Binary files /dev/null and b/assets/assets/3d/bevy_transform_gizmo.png differ diff --git a/assets/assets/3d/bevy_vfx_bag.gif b/assets/assets/3d/bevy_vfx_bag.gif new file mode 100644 index 0000000000..7b5b47a212 Binary files /dev/null and b/assets/assets/3d/bevy_vfx_bag.gif differ diff --git a/assets/assets/3d/bevy_water.webp b/assets/assets/3d/bevy_water.webp new file mode 100644 index 0000000000..909f4087fe Binary files /dev/null and b/assets/assets/3d/bevy_water.webp differ diff --git a/assets/assets/3d/index.html b/assets/assets/3d/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/3d/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/pixelate-mesh/index.html b/assets/assets/3d/pixelate-mesh/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/3d/pixelate-mesh/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/3d/pixelate_mesh.jpg b/assets/assets/3d/pixelate_mesh.jpg new file mode 100644 index 0000000000..11044c0665 Binary files /dev/null and b/assets/assets/3d/pixelate_mesh.jpg differ diff --git a/assets/assets/accessibility/bevy-color-blindness/index.html b/assets/assets/accessibility/bevy-color-blindness/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/accessibility/bevy-color-blindness/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/accessibility/bevy-fluent/index.html b/assets/assets/accessibility/bevy-fluent/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/accessibility/bevy-fluent/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/accessibility/index.html b/assets/assets/accessibility/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/accessibility/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ai/bevior-tree/index.html b/assets/assets/ai/bevior-tree/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ai/bevior-tree/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ai/big-brain/index.html b/assets/assets/ai/big-brain/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ai/big-brain/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ai/index.html b/assets/assets/ai/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/ai/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ai/oxidized-navigation/index.html b/assets/assets/ai/oxidized-navigation/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ai/oxidized-navigation/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ai/oxidized_navigation.jpg b/assets/assets/ai/oxidized_navigation.jpg new file mode 100644 index 0000000000..7e652869c5 Binary files /dev/null and b/assets/assets/ai/oxidized_navigation.jpg differ diff --git a/assets/assets/ai/seldom-map-nav/index.html b/assets/assets/ai/seldom-map-nav/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ai/seldom-map-nav/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/animation/bevy-easings/index.html b/assets/assets/animation/bevy-easings/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/animation/bevy-easings/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/animation/bevy-manim/index.html b/assets/assets/animation/bevy-manim/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/animation/bevy-manim/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/animation/bevy-simple-state-machine/index.html b/assets/assets/animation/bevy-simple-state-machine/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/animation/bevy-simple-state-machine/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/animation/bevy-spine/index.html b/assets/assets/animation/bevy-spine/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/animation/bevy-spine/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/animation/bevy-sprite-animation/index.html b/assets/assets/animation/bevy-sprite-animation/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/animation/bevy-sprite-animation/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/animation/bevy-trickfilm/index.html b/assets/assets/animation/bevy-trickfilm/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/animation/bevy-trickfilm/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/animation/bevy-tweening/index.html b/assets/assets/animation/bevy-tweening/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/animation/bevy-tweening/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/animation/bevy_easings.gif b/assets/assets/animation/bevy_easings.gif new file mode 100644 index 0000000000..3f59da419e Binary files /dev/null and b/assets/assets/animation/bevy_easings.gif differ diff --git a/assets/assets/animation/bevy_spine.webp b/assets/assets/animation/bevy_spine.webp new file mode 100644 index 0000000000..92ad9b7b12 Binary files /dev/null and b/assets/assets/animation/bevy_spine.webp differ diff --git a/assets/assets/animation/bevy_tweening.gif b/assets/assets/animation/bevy_tweening.gif new file mode 100644 index 0000000000..9017c5932e Binary files /dev/null and b/assets/assets/animation/bevy_tweening.gif differ diff --git a/assets/assets/animation/index.html b/assets/assets/animation/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/animation/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/animation/seldom-state/index.html b/assets/assets/animation/seldom-state/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/animation/seldom-state/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy-asset-loader/index.html b/assets/assets/asset loading/bevy-asset-loader/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/asset loading/bevy-asset-loader/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy-asset-ron/index.html b/assets/assets/asset loading/bevy-asset-ron/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/asset loading/bevy-asset-ron/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy-assetio-zip/index.html b/assets/assets/asset loading/bevy-assetio-zip/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/asset loading/bevy-assetio-zip/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy-assets-bundler/index.html b/assets/assets/asset loading/bevy-assets-bundler/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/asset loading/bevy-assets-bundler/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy-common-assets/index.html b/assets/assets/asset loading/bevy-common-assets/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/asset loading/bevy-common-assets/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy-embedded-assets/index.html b/assets/assets/asset loading/bevy-embedded-assets/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/asset loading/bevy-embedded-assets/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy-heterogenous-texture-atlas-loader/index.html b/assets/assets/asset loading/bevy-heterogenous-texture-atlas-loader/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/asset loading/bevy-heterogenous-texture-atlas-loader/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy-qoi/index.html b/assets/assets/asset loading/bevy-qoi/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/asset loading/bevy-qoi/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy-titan/index.html b/assets/assets/asset loading/bevy-titan/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/asset loading/bevy-titan/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy-web-asset/index.html b/assets/assets/asset loading/bevy-web-asset/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/asset loading/bevy-web-asset/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/asset loading/bevy_embedded_assets.png b/assets/assets/asset loading/bevy_embedded_assets.png new file mode 100644 index 0000000000..9af0456388 Binary files /dev/null and b/assets/assets/asset loading/bevy_embedded_assets.png differ diff --git a/assets/assets/asset loading/index.html b/assets/assets/asset loading/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/asset loading/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/audio/bevy-fundsp/index.html b/assets/assets/audio/bevy-fundsp/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/audio/bevy-fundsp/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/audio/bevy-kira-audio/index.html b/assets/assets/audio/bevy-kira-audio/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/audio/bevy-kira-audio/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/audio/bevy-oddio/index.html b/assets/assets/audio/bevy-oddio/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/audio/bevy-oddio/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/audio/bevy-rrise/index.html b/assets/assets/audio/bevy-rrise/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/audio/bevy-rrise/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/audio/index.html b/assets/assets/audio/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/audio/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/backends/bevy-doryen/index.html b/assets/assets/backends/bevy-doryen/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/backends/bevy-doryen/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/backends/bevy-miniquad/index.html b/assets/assets/backends/bevy-miniquad/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/backends/bevy-miniquad/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/backends/bevy-webgl2/index.html b/assets/assets/backends/bevy-webgl2/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/backends/bevy-webgl2/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/backends/index.html b/assets/assets/backends/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/backends/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/backends/prototype-bevy-sdl2/index.html b/assets/assets/backends/prototype-bevy-sdl2/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/backends/prototype-bevy-sdl2/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy-4x-camera/index.html b/assets/assets/camera/bevy-4x-camera/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/bevy-4x-camera/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy-config-cam/index.html b/assets/assets/camera/bevy-config-cam/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/bevy-config-cam/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy-dolly/index.html b/assets/assets/camera/bevy-dolly/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/bevy-dolly/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy-fly-camera/index.html b/assets/assets/camera/bevy-fly-camera/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/bevy-fly-camera/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy-flycam/index.html b/assets/assets/camera/bevy-flycam/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/bevy-flycam/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy-orbit-controls/index.html b/assets/assets/camera/bevy-orbit-controls/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/bevy-orbit-controls/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy-panorbit-camera/index.html b/assets/assets/camera/bevy-panorbit-camera/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/bevy-panorbit-camera/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy-third-person-camera/index.html b/assets/assets/camera/bevy-third-person-camera/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/bevy-third-person-camera/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy-touch-camera/index.html b/assets/assets/camera/bevy-touch-camera/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/bevy-touch-camera/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy-wow/index.html b/assets/assets/camera/bevy-wow/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/bevy-wow/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/bevy_config_cam_low_fov_dark.png b/assets/assets/camera/bevy_config_cam_low_fov_dark.png new file mode 100644 index 0000000000..bf51cbea56 Binary files /dev/null and b/assets/assets/camera/bevy_config_cam_low_fov_dark.png differ diff --git a/assets/assets/camera/bevy_panorbit_camera.gif b/assets/assets/camera/bevy_panorbit_camera.gif new file mode 100644 index 0000000000..da7d2943ed Binary files /dev/null and b/assets/assets/camera/bevy_panorbit_camera.gif differ diff --git a/assets/assets/camera/bevy_third_person_camera.gif b/assets/assets/camera/bevy_third_person_camera.gif new file mode 100644 index 0000000000..0b5f765c6b Binary files /dev/null and b/assets/assets/camera/bevy_third_person_camera.gif differ diff --git a/assets/assets/camera/bevy_touch_camera.webp b/assets/assets/camera/bevy_touch_camera.webp new file mode 100644 index 0000000000..51c45d7568 Binary files /dev/null and b/assets/assets/camera/bevy_touch_camera.webp differ diff --git a/assets/assets/camera/index.html b/assets/assets/camera/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/camera/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/camera/smooth-bevy-cameras/index.html b/assets/assets/camera/smooth-bevy-cameras/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/camera/smooth-bevy-cameras/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/autodefault/index.html b/assets/assets/development tools/autodefault/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/autodefault/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/bevy-debug-text-overlay-demo.gif b/assets/assets/development tools/bevy-debug-text-overlay-demo.gif new file mode 100644 index 0000000000..693322aaf9 Binary files /dev/null and b/assets/assets/development tools/bevy-debug-text-overlay-demo.gif differ diff --git a/assets/assets/development tools/bevy-debug-text-overlay/index.html b/assets/assets/development tools/bevy-debug-text-overlay/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/bevy-debug-text-overlay/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/bevy-inspector-egui/index.html b/assets/assets/development tools/bevy-inspector-egui/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/bevy-inspector-egui/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/bevy-mod-debug-console/index.html b/assets/assets/development tools/bevy-mod-debug-console/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/bevy-mod-debug-console/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/bevy-mod-debugdump/index.html b/assets/assets/development tools/bevy-mod-debugdump/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/bevy-mod-debugdump/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/bevy-mod-gizmos/index.html b/assets/assets/development tools/bevy-mod-gizmos/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/bevy-mod-gizmos/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/bevy-remote-devtools/index.html b/assets/assets/development tools/bevy-remote-devtools/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/bevy-remote-devtools/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/bevy-shadertoy-wgsl/index.html b/assets/assets/development tools/bevy-shadertoy-wgsl/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/bevy-shadertoy-wgsl/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/bevy-yoleck/index.html b/assets/assets/development tools/bevy-yoleck/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/bevy-yoleck/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/bevy_shadertoy_wgsl.gif b/assets/assets/development tools/bevy_shadertoy_wgsl.gif new file mode 100644 index 0000000000..fd98400363 Binary files /dev/null and b/assets/assets/development tools/bevy_shadertoy_wgsl.gif differ diff --git a/assets/assets/development tools/bevycheck/index.html b/assets/assets/development tools/bevycheck/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/bevycheck/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/dexterous-developer/index.html b/assets/assets/development tools/dexterous-developer/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/dexterous-developer/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/index.html b/assets/assets/development tools/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/development tools/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/development tools/pecs/index.html b/assets/assets/development tools/pecs/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/development tools/pecs/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/devices/bevy-streamdeck/index.html b/assets/assets/devices/bevy-streamdeck/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/devices/bevy-streamdeck/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/devices/bevy_streamdeck.gif b/assets/assets/devices/bevy_streamdeck.gif new file mode 100644 index 0000000000..b7e8981daa Binary files /dev/null and b/assets/assets/devices/bevy_streamdeck.gif differ diff --git a/assets/assets/devices/index.html b/assets/assets/devices/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/devices/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-add-events-macro/index.html b/assets/assets/helpers/bevy-add-events-macro/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-add-events-macro/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-adventure/index.html b/assets/assets/helpers/bevy-adventure/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-adventure/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-contrib-colors/index.html b/assets/assets/helpers/bevy-contrib-colors/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-contrib-colors/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-cronjob/index.html b/assets/assets/helpers/bevy-cronjob/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-cronjob/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-cursor/index.html b/assets/assets/helpers/bevy-cursor/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-cursor/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-debug-lines/index.html b/assets/assets/helpers/bevy-debug-lines/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-debug-lines/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-discovery/index.html b/assets/assets/helpers/bevy-discovery/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-discovery/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-ecs-markers/index.html b/assets/assets/helpers/bevy-ecs-markers/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-ecs-markers/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-event-set/index.html b/assets/assets/helpers/bevy-event-set/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-event-set/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-framepace/index.html b/assets/assets/helpers/bevy-framepace/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-framepace/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-image-export/index.html b/assets/assets/helpers/bevy-image-export/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-image-export/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-match-3/index.html b/assets/assets/helpers/bevy-match-3/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-match-3/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-mod-index/index.html b/assets/assets/helpers/bevy-mod-index/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-mod-index/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-mod-sysfail/index.html b/assets/assets/helpers/bevy-mod-sysfail/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-mod-sysfail/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-panic-handler.png b/assets/assets/helpers/bevy-panic-handler.png new file mode 100644 index 0000000000..a27e9dada9 Binary files /dev/null and b/assets/assets/helpers/bevy-panic-handler.png differ diff --git a/assets/assets/helpers/bevy-panic-handler/index.html b/assets/assets/helpers/bevy-panic-handler/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-panic-handler/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-pipelines-ready/index.html b/assets/assets/helpers/bevy-pipelines-ready/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-pipelines-ready/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-plot/index.html b/assets/assets/helpers/bevy-plot/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-plot/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-proto/index.html b/assets/assets/helpers/bevy-proto/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-proto/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-prototype-inline-assets/index.html b/assets/assets/helpers/bevy-prototype-inline-assets/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-prototype-inline-assets/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-scene-hook/index.html b/assets/assets/helpers/bevy-scene-hook/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-scene-hook/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-sequential-actions/index.html b/assets/assets/helpers/bevy-sequential-actions/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-sequential-actions/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-system-graph/index.html b/assets/assets/helpers/bevy-system-graph/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-system-graph/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy-turborand/index.html b/assets/assets/helpers/bevy-turborand/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/bevy-turborand/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/bevy_adventure.webp b/assets/assets/helpers/bevy_adventure.webp new file mode 100644 index 0000000000..22bb1a8641 Binary files /dev/null and b/assets/assets/helpers/bevy_adventure.webp differ diff --git a/assets/assets/helpers/bevy_cursor.png b/assets/assets/helpers/bevy_cursor.png new file mode 100644 index 0000000000..67439cb87f Binary files /dev/null and b/assets/assets/helpers/bevy_cursor.png differ diff --git a/assets/assets/helpers/bevy_ecs_markers.png b/assets/assets/helpers/bevy_ecs_markers.png new file mode 100644 index 0000000000..0d367063ab Binary files /dev/null and b/assets/assets/helpers/bevy_ecs_markers.png differ diff --git a/assets/assets/helpers/bevy_framepace.png b/assets/assets/helpers/bevy_framepace.png new file mode 100644 index 0000000000..2c5cc59d2f Binary files /dev/null and b/assets/assets/helpers/bevy_framepace.png differ diff --git a/assets/assets/helpers/bevy_image_export.png b/assets/assets/helpers/bevy_image_export.png new file mode 100644 index 0000000000..daf18f9d5a Binary files /dev/null and b/assets/assets/helpers/bevy_image_export.png differ diff --git a/assets/assets/helpers/bevy_match3.gif b/assets/assets/helpers/bevy_match3.gif new file mode 100644 index 0000000000..8bc5ee501d Binary files /dev/null and b/assets/assets/helpers/bevy_match3.gif differ diff --git a/assets/assets/helpers/bevy_pipelines_ready.png b/assets/assets/helpers/bevy_pipelines_ready.png new file mode 100644 index 0000000000..d824f7461d Binary files /dev/null and b/assets/assets/helpers/bevy_pipelines_ready.png differ diff --git a/assets/assets/helpers/bevy_plot.png b/assets/assets/helpers/bevy_plot.png new file mode 100644 index 0000000000..cffcf40c67 Binary files /dev/null and b/assets/assets/helpers/bevy_plot.png differ diff --git a/assets/assets/helpers/bevy_proto.png b/assets/assets/helpers/bevy_proto.png new file mode 100644 index 0000000000..bf8971de45 Binary files /dev/null and b/assets/assets/helpers/bevy_proto.png differ diff --git a/assets/assets/helpers/hexx.png b/assets/assets/helpers/hexx.png new file mode 100644 index 0000000000..6cdd98c991 Binary files /dev/null and b/assets/assets/helpers/hexx.png differ diff --git a/assets/assets/helpers/hexx/index.html b/assets/assets/helpers/hexx/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/hexx/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/index.html b/assets/assets/helpers/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/helpers/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/iyes-loopless/index.html b/assets/assets/helpers/iyes-loopless/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/iyes-loopless/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/iyes-progress/index.html b/assets/assets/helpers/iyes-progress/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/iyes-progress/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/iyes-scene-tools/index.html b/assets/assets/helpers/iyes-scene-tools/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/iyes-scene-tools/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/seldom-fn-plugin/index.html b/assets/assets/helpers/seldom-fn-plugin/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/seldom-fn-plugin/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/seldom-interop/index.html b/assets/assets/helpers/seldom-interop/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/seldom-interop/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/helpers/spew/index.html b/assets/assets/helpers/spew/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/helpers/spew/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/index.html b/assets/assets/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/bevy-advanced-input/index.html b/assets/assets/input/bevy-advanced-input/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/bevy-advanced-input/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/bevy-global-input/index.html b/assets/assets/input/bevy-global-input/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/bevy-global-input/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/bevy-input-actionmap/index.html b/assets/assets/input/bevy-input-actionmap/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/bevy-input-actionmap/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/bevy-input-mapper-plugin/index.html b/assets/assets/input/bevy-input-mapper-plugin/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/bevy-input-mapper-plugin/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/bevy-midi/index.html b/assets/assets/input/bevy-midi/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/bevy-midi/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/bevy-osc/index.html b/assets/assets/input/bevy-osc/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/bevy-osc/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/bevy-rosc/index.html b/assets/assets/input/bevy-rosc/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/bevy-rosc/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/bevy-serial/index.html b/assets/assets/input/bevy-serial/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/bevy-serial/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/bevy_midi_logo.png b/assets/assets/input/bevy_midi_logo.png new file mode 100644 index 0000000000..396fadacbe Binary files /dev/null and b/assets/assets/input/bevy_midi_logo.png differ diff --git a/assets/assets/input/ezinput/index.html b/assets/assets/input/ezinput/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/ezinput/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/index.html b/assets/assets/input/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/input/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/leafwing-input-manager/index.html b/assets/assets/input/leafwing-input-manager/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/leafwing-input-manager/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/virtual-joystick/index.html b/assets/assets/input/virtual-joystick/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/input/virtual-joystick/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/input/virtual_joystick.gif b/assets/assets/input/virtual_joystick.gif new file mode 100644 index 0000000000..6841510d9f Binary files /dev/null and b/assets/assets/input/virtual_joystick.gif differ diff --git a/assets/assets/networking/bevy-backroll/index.html b/assets/assets/networking/bevy-backroll/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-backroll/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-client-server-events/index.html b/assets/assets/networking/bevy-client-server-events/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-client-server-events/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-eventwork/index.html b/assets/assets/networking/bevy-eventwork/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-eventwork/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-ggrs/index.html b/assets/assets/networking/bevy-ggrs/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-ggrs/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-matchbox/index.html b/assets/assets/networking/bevy-matchbox/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-matchbox/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-mod-reqwest/index.html b/assets/assets/networking/bevy-mod-reqwest/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-mod-reqwest/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-nest/index.html b/assets/assets/networking/bevy-nest/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-nest/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-networking-turbulence/index.html b/assets/assets/networking/bevy-networking-turbulence/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-networking-turbulence/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-pigeon/index.html b/assets/assets/networking/bevy-pigeon/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-pigeon/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-prototype-laminar-networking/index.html b/assets/assets/networking/bevy-prototype-laminar-networking/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-prototype-laminar-networking/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-prototype-simple-net/index.html b/assets/assets/networking/bevy-prototype-simple-net/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-prototype-simple-net/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-quinnet/index.html b/assets/assets/networking/bevy-quinnet/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-quinnet/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-renet/index.html b/assets/assets/networking/bevy-renet/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-renet/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-replicon/index.html b/assets/assets/networking/bevy-replicon/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-replicon/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-simple-networking/index.html b/assets/assets/networking/bevy-simple-networking/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-simple-networking/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-spicy-networking/index.html b/assets/assets/networking/bevy-spicy-networking/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-spicy-networking/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bevy-stardust/index.html b/assets/assets/networking/bevy-stardust/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bevy-stardust/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/bootleg-networking/index.html b/assets/assets/networking/bootleg-networking/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/bootleg-networking/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/ggrs_logo.png b/assets/assets/networking/ggrs_logo.png new file mode 100644 index 0000000000..4761eec4dd Binary files /dev/null and b/assets/assets/networking/ggrs_logo.png differ diff --git a/assets/assets/networking/index.html b/assets/assets/networking/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/networking/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/matchbox_logo.png b/assets/assets/networking/matchbox_logo.png new file mode 100644 index 0000000000..7f213a6546 Binary files /dev/null and b/assets/assets/networking/matchbox_logo.png differ diff --git a/assets/assets/networking/naia/index.html b/assets/assets/networking/naia/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/networking/naia/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/networking/naia_logo.png b/assets/assets/networking/naia_logo.png new file mode 100644 index 0000000000..c2ede22e1e Binary files /dev/null and b/assets/assets/networking/naia_logo.png differ diff --git a/assets/assets/persistence/bevy-persistent-windows/index.html b/assets/assets/persistence/bevy-persistent-windows/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/persistence/bevy-persistent-windows/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/persistence/bevy-persistent/index.html b/assets/assets/persistence/bevy-persistent/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/persistence/bevy-persistent/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/persistence/bevy-pkv/index.html b/assets/assets/persistence/bevy-pkv/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/persistence/bevy-pkv/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/persistence/bevy-save/index.html b/assets/assets/persistence/bevy-save/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/persistence/bevy-save/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/persistence/bevy-settings/index.html b/assets/assets/persistence/bevy-settings/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/persistence/bevy-settings/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/persistence/bevy_save.webp b/assets/assets/persistence/bevy_save.webp new file mode 100644 index 0000000000..19a65274ff Binary files /dev/null and b/assets/assets/persistence/bevy_save.webp differ diff --git a/assets/assets/persistence/index.html b/assets/assets/persistence/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/persistence/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/persistence/moonshine-save/index.html b/assets/assets/persistence/moonshine-save/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/persistence/moonshine-save/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/physics/bevy-fpc/index.html b/assets/assets/physics/bevy-fpc/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/physics/bevy-fpc/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/physics/bevy-mod-wanderlust/index.html b/assets/assets/physics/bevy-mod-wanderlust/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/physics/bevy-mod-wanderlust/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/physics/bevy-physimple/index.html b/assets/assets/physics/bevy-physimple/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/physics/bevy-physimple/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/physics/bevy-rapier/index.html b/assets/assets/physics/bevy-rapier/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/physics/bevy-rapier/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/physics/bevy-silk/index.html b/assets/assets/physics/bevy-silk/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/physics/bevy-silk/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/physics/bevy-tnua/index.html b/assets/assets/physics/bevy-tnua/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/physics/bevy-tnua/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/physics/bevy-xpbd/index.html b/assets/assets/physics/bevy-xpbd/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/physics/bevy-xpbd/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/physics/bevy_fpc.gif b/assets/assets/physics/bevy_fpc.gif new file mode 100644 index 0000000000..0a3c920ca9 Binary files /dev/null and b/assets/assets/physics/bevy_fpc.gif differ diff --git a/assets/assets/physics/bevy_silk.webp b/assets/assets/physics/bevy_silk.webp new file mode 100644 index 0000000000..97db0a1522 Binary files /dev/null and b/assets/assets/physics/bevy_silk.webp differ diff --git a/assets/assets/physics/index.html b/assets/assets/physics/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/physics/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/physics/physme/index.html b/assets/assets/physics/physme/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/physics/physme/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/platform integration/bevy-discord-presence/index.html b/assets/assets/platform integration/bevy-discord-presence/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/platform integration/bevy-discord-presence/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/platform integration/bevy-steamworks/index.html b/assets/assets/platform integration/bevy-steamworks/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/platform integration/bevy-steamworks/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/platform integration/index.html b/assets/assets/platform integration/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/platform integration/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/scripting/bevy-mod-scripting/index.html b/assets/assets/scripting/bevy-mod-scripting/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/scripting/bevy-mod-scripting/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/scripting/bevy-scriptum/index.html b/assets/assets/scripting/bevy-scriptum/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/scripting/bevy-scriptum/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/scripting/bevy-wasm/index.html b/assets/assets/scripting/bevy-wasm/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/scripting/bevy-wasm/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/scripting/bevy_scripting_logo.png b/assets/assets/scripting/bevy_scripting_logo.png new file mode 100644 index 0000000000..edfd38ef09 Binary files /dev/null and b/assets/assets/scripting/bevy_scripting_logo.png differ diff --git a/assets/assets/scripting/index.html b/assets/assets/scripting/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/scripting/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/scripting/webassembly_logo.png b/assets/assets/scripting/webassembly_logo.png new file mode 100644 index 0000000000..55d75644c7 Binary files /dev/null and b/assets/assets/scripting/webassembly_logo.png differ diff --git a/assets/assets/shapes/bevy-mod-rounded-box/index.html b/assets/assets/shapes/bevy-mod-rounded-box/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/shapes/bevy-mod-rounded-box/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/shapes/bevy-more-shapes/index.html b/assets/assets/shapes/bevy-more-shapes/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/shapes/bevy-more-shapes/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/shapes/bevy-smud/index.html b/assets/assets/shapes/bevy-smud/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/shapes/bevy-smud/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/shapes/bevy-svg/index.html b/assets/assets/shapes/bevy-svg/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/shapes/bevy-svg/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/shapes/bevy-vector-shapes/index.html b/assets/assets/shapes/bevy-vector-shapes/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/shapes/bevy-vector-shapes/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/shapes/bevy_mod_rounded_box.png b/assets/assets/shapes/bevy_mod_rounded_box.png new file mode 100644 index 0000000000..af23559999 Binary files /dev/null and b/assets/assets/shapes/bevy_mod_rounded_box.png differ diff --git a/assets/assets/shapes/bevy_more_shapes_thumbnail.png b/assets/assets/shapes/bevy_more_shapes_thumbnail.png new file mode 100644 index 0000000000..2a9652f95d Binary files /dev/null and b/assets/assets/shapes/bevy_more_shapes_thumbnail.png differ diff --git a/assets/assets/shapes/bevy_smud.png b/assets/assets/shapes/bevy_smud.png new file mode 100644 index 0000000000..61a9adb1aa Binary files /dev/null and b/assets/assets/shapes/bevy_smud.png differ diff --git a/assets/assets/shapes/bevy_vector_shapes.gif b/assets/assets/shapes/bevy_vector_shapes.gif new file mode 100644 index 0000000000..e13503d020 Binary files /dev/null and b/assets/assets/shapes/bevy_vector_shapes.gif differ diff --git a/assets/assets/shapes/index.html b/assets/assets/shapes/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/shapes/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/social/bevy-jornet/index.html b/assets/assets/social/bevy-jornet/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/social/bevy-jornet/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/social/bevy_jornet.png b/assets/assets/social/bevy_jornet.png new file mode 100644 index 0000000000..434a5444b8 Binary files /dev/null and b/assets/assets/social/bevy_jornet.png differ diff --git a/assets/assets/social/index.html b/assets/assets/social/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/social/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/templates/bevy-game-template/index.html b/assets/assets/templates/bevy-game-template/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/templates/bevy-game-template/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/templates/bevy-shell.png b/assets/assets/templates/bevy-shell.png new file mode 100644 index 0000000000..2a427162d7 Binary files /dev/null and b/assets/assets/templates/bevy-shell.png differ diff --git a/assets/assets/templates/bevy-shell/index.html b/assets/assets/templates/bevy-shell/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/templates/bevy-shell/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/templates/bevy-sr-template.png b/assets/assets/templates/bevy-sr-template.png new file mode 100644 index 0000000000..5ce6a567df Binary files /dev/null and b/assets/assets/templates/bevy-sr-template.png differ diff --git a/assets/assets/templates/foxtrot.webp b/assets/assets/templates/foxtrot.webp new file mode 100644 index 0000000000..0d313bfedb Binary files /dev/null and b/assets/assets/templates/foxtrot.webp differ diff --git a/assets/assets/templates/foxtrot/index.html b/assets/assets/templates/foxtrot/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/templates/foxtrot/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/templates/index.html b/assets/assets/templates/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/templates/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/templates/official-github-template.png b/assets/assets/templates/official-github-template.png new file mode 100644 index 0000000000..5e72defd21 Binary files /dev/null and b/assets/assets/templates/official-github-template.png differ diff --git a/assets/assets/templates/official-github-template/index.html b/assets/assets/templates/official-github-template/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/templates/official-github-template/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/templates/sr-bevy-template/index.html b/assets/assets/templates/sr-bevy-template/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/templates/sr-bevy-template/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-console/index.html b/assets/assets/ui/bevy-console/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-console/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-cosmic-edit/index.html b/assets/assets/ui/bevy-cosmic-edit/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-cosmic-edit/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-css-prototype/index.html b/assets/assets/ui/bevy-css-prototype/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-css-prototype/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-ecss/index.html b/assets/assets/ui/bevy-ecss/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-ecss/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-egui/index.html b/assets/assets/ui/bevy-egui/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-egui/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-iced/index.html b/assets/assets/ui/bevy-iced/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-iced/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-megaui/index.html b/assets/assets/ui/bevy-megaui/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-megaui/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-mod-ui-independent-text/index.html b/assets/assets/ui/bevy-mod-ui-independent-text/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-mod-ui-independent-text/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-mod-ui-sprite/index.html b/assets/assets/ui/bevy-mod-ui-sprite/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-mod-ui-sprite/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-mod-ui-texture-atlas-image/index.html b/assets/assets/ui/bevy-mod-ui-texture-atlas-image/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-mod-ui-texture-atlas-image/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-ninepatch/index.html b/assets/assets/ui/bevy-ninepatch/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-ninepatch/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-quickmenu/index.html b/assets/assets/ui/bevy-quickmenu/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-quickmenu/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-screen-diagnostics/index.html b/assets/assets/ui/bevy-screen-diagnostics/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-screen-diagnostics/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-simple-text-input/index.html b/assets/assets/ui/bevy-simple-text-input/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-simple-text-input/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-splashscreen/index.html b/assets/assets/ui/bevy-splashscreen/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-splashscreen/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-text-popup/index.html b/assets/assets/ui/bevy-text-popup/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-text-popup/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-ui-borders/index.html b/assets/assets/ui/bevy-ui-borders/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-ui-borders/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-ui-exact-image/index.html b/assets/assets/ui/bevy-ui-exact-image/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-ui-exact-image/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy-ui-navigation/index.html b/assets/assets/ui/bevy-ui-navigation/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/bevy-ui-navigation/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/bevy_cosmic_edit.gif b/assets/assets/ui/bevy_cosmic_edit.gif new file mode 100644 index 0000000000..5df5d59c7c Binary files /dev/null and b/assets/assets/ui/bevy_cosmic_edit.gif differ diff --git a/assets/assets/ui/bevy_ecss.png b/assets/assets/ui/bevy_ecss.png new file mode 100644 index 0000000000..77d1f39401 Binary files /dev/null and b/assets/assets/ui/bevy_ecss.png differ diff --git a/assets/assets/ui/bevy_mod_ui_independent_text.png b/assets/assets/ui/bevy_mod_ui_independent_text.png new file mode 100644 index 0000000000..305a50f8c1 Binary files /dev/null and b/assets/assets/ui/bevy_mod_ui_independent_text.png differ diff --git a/assets/assets/ui/bevy_mod_ui_texture_atlas_image.png b/assets/assets/ui/bevy_mod_ui_texture_atlas_image.png new file mode 100644 index 0000000000..e831fd5046 Binary files /dev/null and b/assets/assets/ui/bevy_mod_ui_texture_atlas_image.png differ diff --git a/assets/assets/ui/bevy_ninepatch.png b/assets/assets/ui/bevy_ninepatch.png new file mode 100644 index 0000000000..bddcc651b5 Binary files /dev/null and b/assets/assets/ui/bevy_ninepatch.png differ diff --git a/assets/assets/ui/bevy_quickmenu.gif b/assets/assets/ui/bevy_quickmenu.gif new file mode 100644 index 0000000000..497f496807 Binary files /dev/null and b/assets/assets/ui/bevy_quickmenu.gif differ diff --git a/assets/assets/ui/bevy_screen_diagnostics.gif b/assets/assets/ui/bevy_screen_diagnostics.gif new file mode 100644 index 0000000000..dd5ba08611 Binary files /dev/null and b/assets/assets/ui/bevy_screen_diagnostics.gif differ diff --git a/assets/assets/ui/bevy_simple_text_input.gif b/assets/assets/ui/bevy_simple_text_input.gif new file mode 100644 index 0000000000..a7bb8abfee Binary files /dev/null and b/assets/assets/ui/bevy_simple_text_input.gif differ diff --git a/assets/assets/ui/bevy_splash_screen.gif b/assets/assets/ui/bevy_splash_screen.gif new file mode 100644 index 0000000000..25d7d4ab90 Binary files /dev/null and b/assets/assets/ui/bevy_splash_screen.gif differ diff --git a/assets/assets/ui/bevy_text_popup.png b/assets/assets/ui/bevy_text_popup.png new file mode 100644 index 0000000000..ac3e8c8386 Binary files /dev/null and b/assets/assets/ui/bevy_text_popup.png differ diff --git a/assets/assets/ui/cuicui-layout/index.html b/assets/assets/ui/cuicui-layout/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/assets/ui/cuicui-layout/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/assets/ui/cuicui_layout.png b/assets/assets/ui/cuicui_layout.png new file mode 100644 index 0000000000..5fdacedfff Binary files /dev/null and b/assets/assets/ui/cuicui_layout.png differ diff --git a/assets/assets/ui/index.html b/assets/assets/ui/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/assets/ui/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/bevy_icon_dark.svg b/assets/bevy_icon_dark.svg new file mode 100644 index 0000000000..8487b67060 --- /dev/null +++ b/assets/bevy_icon_dark.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/bevy_logo_dark.svg b/assets/bevy_logo_dark.svg new file mode 100644 index 0000000000..241509d32d --- /dev/null +++ b/assets/bevy_logo_dark.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/bevy_logo_docs.svg b/assets/bevy_logo_docs.svg new file mode 100644 index 0000000000..7f859f4b06 --- /dev/null +++ b/assets/bevy_logo_docs.svg @@ -0,0 +1,180 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/bevy_logo_fill.png b/assets/bevy_logo_fill.png new file mode 100644 index 0000000000..2b71c7a25c Binary files /dev/null and b/assets/bevy_logo_fill.png differ diff --git a/assets/bevy_ui.svg b/assets/bevy_ui.svg new file mode 100644 index 0000000000..b443832c09 --- /dev/null +++ b/assets/bevy_ui.svg @@ -0,0 +1,149 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/boat.png b/assets/boat.png new file mode 100644 index 0000000000..189f1a2848 Binary files /dev/null and b/assets/boat.png differ diff --git a/assets/book.svg b/assets/book.svg new file mode 100644 index 0000000000..042753c62e --- /dev/null +++ b/assets/book.svg @@ -0,0 +1,144 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/discord.svg b/assets/discord.svg new file mode 100644 index 0000000000..ca65400760 --- /dev/null +++ b/assets/discord.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/ecs.svg b/assets/ecs.svg new file mode 100644 index 0000000000..db8d329d5a --- /dev/null +++ b/assets/ecs.svg @@ -0,0 +1,356 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/embark.png b/assets/embark.png new file mode 100644 index 0000000000..41c4f1c4b0 Binary files /dev/null and b/assets/embark.png differ diff --git a/assets/examples/android-res/mipmap-mdpi/ic_launcher.png b/assets/examples/android-res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000..5e72defd21 Binary files /dev/null and b/assets/examples/android-res/mipmap-mdpi/ic_launcher.png differ diff --git a/assets/examples/branding/banner.png b/assets/examples/branding/banner.png new file mode 100644 index 0000000000..3c5db79ac2 Binary files /dev/null and b/assets/examples/branding/banner.png differ diff --git a/assets/examples/branding/bevy_bird_simpleicons.svg b/assets/examples/branding/bevy_bird_simpleicons.svg new file mode 100644 index 0000000000..dc9c07bb9d --- /dev/null +++ b/assets/examples/branding/bevy_bird_simpleicons.svg @@ -0,0 +1 @@ +Bevy Engine \ No newline at end of file diff --git a/assets/examples/branding/bevy_logo_dark.png b/assets/examples/branding/bevy_logo_dark.png new file mode 100644 index 0000000000..3e2cbdf519 Binary files /dev/null and b/assets/examples/branding/bevy_logo_dark.png differ diff --git a/assets/examples/branding/bevy_logo_dark.svg b/assets/examples/branding/bevy_logo_dark.svg new file mode 100644 index 0000000000..241509d32d --- /dev/null +++ b/assets/examples/branding/bevy_logo_dark.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/examples/branding/bevy_logo_dark_big.png b/assets/examples/branding/bevy_logo_dark_big.png new file mode 100644 index 0000000000..23673192e3 Binary files /dev/null and b/assets/examples/branding/bevy_logo_dark_big.png differ diff --git a/assets/examples/branding/bevy_logo_light.png b/assets/examples/branding/bevy_logo_light.png new file mode 100644 index 0000000000..f144a3a6f1 Binary files /dev/null and b/assets/examples/branding/bevy_logo_light.png differ diff --git a/assets/examples/branding/bevy_logo_light.svg b/assets/examples/branding/bevy_logo_light.svg new file mode 100644 index 0000000000..408910ee6f --- /dev/null +++ b/assets/examples/branding/bevy_logo_light.svg @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/examples/branding/bevy_logo_light_dark_and_dimmed.svg b/assets/examples/branding/bevy_logo_light_dark_and_dimmed.svg new file mode 100644 index 0000000000..9d1e1e1ea5 --- /dev/null +++ b/assets/examples/branding/bevy_logo_light_dark_and_dimmed.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/examples/branding/icon.png b/assets/examples/branding/icon.png new file mode 100644 index 0000000000..8c9640bf27 Binary files /dev/null and b/assets/examples/branding/icon.png differ diff --git a/assets/examples/branding/icon.svg b/assets/examples/branding/icon.svg new file mode 100644 index 0000000000..c7c0381928 --- /dev/null +++ b/assets/examples/branding/icon.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/examples/data/asset.custom b/assets/examples/data/asset.custom new file mode 100644 index 0000000000..0a53b2d09a --- /dev/null +++ b/assets/examples/data/asset.custom @@ -0,0 +1,3 @@ +CustomAsset ( + value: 42 +) \ No newline at end of file diff --git a/assets/examples/docs/Mesh.png b/assets/examples/docs/Mesh.png new file mode 100644 index 0000000000..fd556d3427 Binary files /dev/null and b/assets/examples/docs/Mesh.png differ diff --git a/assets/examples/environment_maps/info.txt b/assets/examples/environment_maps/info.txt new file mode 100644 index 0000000000..f13321817b --- /dev/null +++ b/assets/examples/environment_maps/info.txt @@ -0,0 +1,6 @@ +The pisa_*.ktx2 files were generated from https://github.com/KhronosGroup/glTF-Sample-Environments/blob/master/pisa.hdr using the following tools and commands: +- IBL environment map prefiltering to cubemaps: https://github.com/KhronosGroup/glTF-IBL-Sampler + - Diffuse: ./cli -inputPath pisa.hdr -outCubeMap pisa_diffuse.ktx2 -distribution Lambertian -cubeMapResolution 32 + - Specular: ./cli -inputPath pisa.hdr -outCubeMap pisa_specular.ktx2 -distribution GGX -cubeMapResolution 512 +- Converting to rgb9e5 format with zstd 'supercompression': https://github.com/DGriffin91/bevy_mod_environment_map_tools + - cargo run --release -- --inputs pisa_diffuse.ktx2,pisa_specular.ktx2 --outputs pisa_diffuse_rgb9e5_zstd.ktx2,pisa_specular_rgb9e5_zstd.ktx2 diff --git a/assets/examples/environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2 b/assets/examples/environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2 new file mode 100644 index 0000000000..e260df24bd Binary files /dev/null and b/assets/examples/environment_maps/pisa_diffuse_rgb9e5_zstd.ktx2 differ diff --git a/assets/examples/environment_maps/pisa_specular_rgb9e5_zstd.ktx2 b/assets/examples/environment_maps/pisa_specular_rgb9e5_zstd.ktx2 new file mode 100644 index 0000000000..2018838de5 Binary files /dev/null and b/assets/examples/environment_maps/pisa_specular_rgb9e5_zstd.ktx2 differ diff --git a/assets/examples/fonts/FiraMono-LICENSE b/assets/examples/fonts/FiraMono-LICENSE new file mode 100644 index 0000000000..5e4608f24a --- /dev/null +++ b/assets/examples/fonts/FiraMono-LICENSE @@ -0,0 +1,93 @@ +Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/examples/fonts/FiraMono-Medium.ttf b/assets/examples/fonts/FiraMono-Medium.ttf new file mode 100755 index 0000000000..1e95ced4c4 Binary files /dev/null and b/assets/examples/fonts/FiraMono-Medium.ttf differ diff --git a/assets/examples/fonts/FiraSans-Bold.ttf b/assets/examples/fonts/FiraSans-Bold.ttf new file mode 100755 index 0000000000..95e1660240 Binary files /dev/null and b/assets/examples/fonts/FiraSans-Bold.ttf differ diff --git a/assets/examples/models/AlienCake/alien.glb b/assets/examples/models/AlienCake/alien.glb new file mode 100644 index 0000000000..f61295e4b9 Binary files /dev/null and b/assets/examples/models/AlienCake/alien.glb differ diff --git a/assets/examples/models/AlienCake/cakeBirthday.glb b/assets/examples/models/AlienCake/cakeBirthday.glb new file mode 100644 index 0000000000..e65cdcfcfd Binary files /dev/null and b/assets/examples/models/AlienCake/cakeBirthday.glb differ diff --git a/assets/examples/models/AlienCake/tile.glb b/assets/examples/models/AlienCake/tile.glb new file mode 100644 index 0000000000..daf5ead75e Binary files /dev/null and b/assets/examples/models/AlienCake/tile.glb differ diff --git a/assets/examples/models/Box0.bin b/assets/examples/models/Box0.bin new file mode 100644 index 0000000000..d7798abb51 Binary files /dev/null and b/assets/examples/models/Box0.bin differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet.bin b/assets/examples/models/FlightHelmet/FlightHelmet.bin new file mode 100644 index 0000000000..3a878be10d Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet.bin differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet.gltf b/assets/examples/models/FlightHelmet/FlightHelmet.gltf new file mode 100644 index 0000000000..37687d8e9a --- /dev/null +++ b/assets/examples/models/FlightHelmet/FlightHelmet.gltf @@ -0,0 +1,705 @@ +{ + "asset": { + "version": "2.0", + "generator": "babylon.js glTF exporter for Maya 2018 v20200228.3 (with minor hand modifications)" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0, + 1, + 2, + 3, + 4, + 5 + ] + } + ], + "nodes": [ + { + "mesh": 0, + "name": "Hose_low" + }, + { + "mesh": 1, + "name": "RubberWood_low" + }, + { + "mesh": 2, + "name": "GlassPlastic_low" + }, + { + "mesh": 3, + "name": "MetalParts_low" + }, + { + "mesh": 4, + "name": "LeatherParts_low" + }, + { + "mesh": 5, + "name": "Lenses_low" + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 1, + "TANGENT": 2, + "NORMAL": 3, + "TEXCOORD_0": 4 + }, + "indices": 0, + "material": 0 + } + ], + "name": "Hose_low" + }, + { + "primitives": [ + { + "attributes": { + "POSITION": 6, + "TANGENT": 7, + "NORMAL": 8, + "TEXCOORD_0": 9 + }, + "indices": 5, + "material": 1 + } + ], + "name": "RubberWood_low" + }, + { + "primitives": [ + { + "attributes": { + "POSITION": 11, + "TANGENT": 12, + "NORMAL": 13, + "TEXCOORD_0": 14 + }, + "indices": 10, + "material": 2 + } + ], + "name": "GlassPlastic_low" + }, + { + "primitives": [ + { + "attributes": { + "POSITION": 16, + "TANGENT": 17, + "NORMAL": 18, + "TEXCOORD_0": 19 + }, + "indices": 15, + "material": 3 + } + ], + "name": "MetalParts_low" + }, + { + "primitives": [ + { + "attributes": { + "POSITION": 21, + "TANGENT": 22, + "NORMAL": 23, + "TEXCOORD_0": 24 + }, + "indices": 20, + "material": 4 + } + ], + "name": "LeatherParts_low" + }, + { + "primitives": [ + { + "attributes": { + "POSITION": 26, + "TANGENT": 27, + "NORMAL": 28, + "TEXCOORD_0": 29 + }, + "indices": 25, + "material": 5 + } + ], + "name": "Lenses_low" + } + ], + "accessors": [ + { + "bufferView": 0, + "componentType": 5123, + "count": 59040, + "type": "SCALAR", + "name": "accessorIndices" + }, + { + "bufferView": 1, + "componentType": 5126, + "count": 10472, + "max": [ + 0.10810829, + 0.356580257, + 0.190409869 + ], + "min": [ + -0.07221258, + 0.104120225, + -0.088394776 + ], + "type": "VEC3", + "name": "accessorPositions" + }, + { + "bufferView": 2, + "componentType": 5126, + "count": 10472, + "type": "VEC4", + "name": "accessorTangents" + }, + { + "bufferView": 1, + "byteOffset": 125664, + "componentType": 5126, + "count": 10472, + "type": "VEC3", + "name": "accessorNormals" + }, + { + "bufferView": 3, + "componentType": 5126, + "count": 10472, + "type": "VEC2", + "name": "accessorUVs" + }, + { + "bufferView": 0, + "byteOffset": 118080, + "componentType": 5123, + "count": 72534, + "type": "SCALAR", + "name": "accessorIndices" + }, + { + "bufferView": 1, + "byteOffset": 251328, + "componentType": 5126, + "count": 13638, + "max": [ + 0.162940636, + 0.7025226, + 0.200029165 + ], + "min": [ + -0.158857465, + -2.14242937E-05, + -0.171545789 + ], + "type": "VEC3", + "name": "accessorPositions" + }, + { + "bufferView": 2, + "byteOffset": 167552, + "componentType": 5126, + "count": 13638, + "type": "VEC4", + "name": "accessorTangents" + }, + { + "bufferView": 1, + "byteOffset": 414984, + "componentType": 5126, + "count": 13638, + "type": "VEC3", + "name": "accessorNormals" + }, + { + "bufferView": 3, + "byteOffset": 83776, + "componentType": 5126, + "count": 13638, + "type": "VEC2", + "name": "accessorUVs" + }, + { + "bufferView": 0, + "byteOffset": 263148, + "componentType": 5123, + "count": 24408, + "type": "SCALAR", + "name": "accessorIndices" + }, + { + "bufferView": 1, + "byteOffset": 578640, + "componentType": 5126, + "count": 4676, + "max": [ + 0.140494063, + 0.61828655, + 0.147373646 + ], + "min": [ + -0.140846014, + 0.440957, + -0.107818365 + ], + "type": "VEC3", + "name": "accessorPositions" + }, + { + "bufferView": 2, + "byteOffset": 385760, + "componentType": 5126, + "count": 4676, + "type": "VEC4", + "name": "accessorTangents" + }, + { + "bufferView": 1, + "byteOffset": 634752, + "componentType": 5126, + "count": 4676, + "type": "VEC3", + "name": "accessorNormals" + }, + { + "bufferView": 3, + "byteOffset": 192880, + "componentType": 5126, + "count": 4676, + "type": "VEC2", + "name": "accessorUVs" + }, + { + "bufferView": 0, + "byteOffset": 311964, + "componentType": 5123, + "count": 60288, + "type": "SCALAR", + "name": "accessorIndices" + }, + { + "bufferView": 1, + "byteOffset": 690864, + "componentType": 5126, + "count": 13636, + "max": [ + 0.132708371, + 0.6024364, + 0.199477077 + ], + "min": [ + -0.203642711, + 0.02116075, + -0.147512689 + ], + "type": "VEC3", + "name": "accessorPositions" + }, + { + "bufferView": 2, + "byteOffset": 460576, + "componentType": 5126, + "count": 13636, + "type": "VEC4", + "name": "accessorTangents" + }, + { + "bufferView": 1, + "byteOffset": 854496, + "componentType": 5126, + "count": 13636, + "type": "VEC3", + "name": "accessorNormals" + }, + { + "bufferView": 3, + "byteOffset": 230288, + "componentType": 5126, + "count": 13636, + "type": "VEC2", + "name": "accessorUVs" + }, + { + "bufferView": 0, + "byteOffset": 432540, + "componentType": 5123, + "count": 65688, + "type": "SCALAR", + "name": "accessorIndices" + }, + { + "bufferView": 1, + "byteOffset": 1018128, + "componentType": 5126, + "count": 12534, + "max": [ + 0.124933377, + 0.716000438, + 0.129168555 + ], + "min": [ + -0.125863016, + 0.2958266, + -0.1541516 + ], + "type": "VEC3", + "name": "accessorPositions" + }, + { + "bufferView": 2, + "byteOffset": 678752, + "componentType": 5126, + "count": 12534, + "type": "VEC4", + "name": "accessorTangents" + }, + { + "bufferView": 1, + "byteOffset": 1168536, + "componentType": 5126, + "count": 12534, + "type": "VEC3", + "name": "accessorNormals" + }, + { + "bufferView": 3, + "byteOffset": 339376, + "componentType": 5126, + "count": 12534, + "type": "VEC2", + "name": "accessorUVs" + }, + { + "bufferView": 0, + "byteOffset": 563916, + "componentType": 5123, + "count": 2208, + "type": "SCALAR", + "name": "accessorIndices" + }, + { + "bufferView": 1, + "byteOffset": 1318944, + "componentType": 5126, + "count": 436, + "max": [ + 0.101920746, + 0.5936986, + 0.152926728 + ], + "min": [ + -0.101920947, + 0.5300429, + 0.090174824 + ], + "type": "VEC3", + "name": "accessorPositions" + }, + { + "bufferView": 2, + "byteOffset": 879296, + "componentType": 5126, + "count": 436, + "type": "VEC4", + "name": "accessorTangents" + }, + { + "bufferView": 1, + "byteOffset": 1324176, + "componentType": 5126, + "count": 436, + "type": "VEC3", + "name": "accessorNormals" + }, + { + "bufferView": 3, + "byteOffset": 439648, + "componentType": 5126, + "count": 436, + "type": "VEC2", + "name": "accessorUVs" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 568332, + "name": "bufferViewScalar" + }, + { + "buffer": 0, + "byteOffset": 568332, + "byteLength": 1329408, + "byteStride": 12, + "name": "bufferViewFloatVec3" + }, + { + "buffer": 0, + "byteOffset": 1897740, + "byteLength": 886272, + "byteStride": 16, + "name": "bufferViewFloatVec4" + }, + { + "buffer": 0, + "byteOffset": 2784012, + "byteLength": 443136, + "byteStride": 8, + "name": "bufferViewFloatVec2" + } + ], + "buffers": [ + { + "uri": "FlightHelmet.bin", + "byteLength": 3227148 + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 2 + }, + "metallicRoughnessTexture": { + "index": 1 + } + }, + "normalTexture": { + "index": 0 + }, + "occlusionTexture": { + "index": 1 + }, + "doubleSided": true, + "name": "HoseMat" + }, + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 2 + }, + "metallicRoughnessTexture": { + "index": 1 + } + }, + "normalTexture": { + "index": 0 + }, + "occlusionTexture": { + "index": 1 + }, + "name": "RubberWoodMat" + }, + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 5 + }, + "metallicRoughnessTexture": { + "index": 4 + } + }, + "normalTexture": { + "index": 3 + }, + "occlusionTexture": { + "index": 4 + }, + "name": "GlassPlasticMat" + }, + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 8 + }, + "metallicRoughnessTexture": { + "index": 7 + } + }, + "normalTexture": { + "index": 6 + }, + "occlusionTexture": { + "index": 7 + }, + "name": "MetalPartsMat" + }, + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 11 + }, + "metallicRoughnessTexture": { + "index": 10 + } + }, + "normalTexture": { + "index": 9 + }, + "occlusionTexture": { + "index": 10 + }, + "name": "LeatherPartsMat" + }, + { + "pbrMetallicRoughness": { + "baseColorTexture": { + "index": 14 + }, + "metallicRoughnessTexture": { + "index": 13 + } + }, + "normalTexture": { + "index": 12 + }, + "occlusionTexture": { + "index": 13 + }, + "alphaMode": "BLEND", + "name": "LensesMat" + } + ], + "textures": [ + { + "sampler": 0, + "source": 0, + "name": "FlightHelmet_Materials_RubberWoodMat_Normal.png" + }, + { + "sampler": 0, + "source": 1, + "name": "FlightHelmet_Materials_RubberWoodMat_OcclusionRoughMetal.png" + }, + { + "sampler": 0, + "source": 2, + "name": "FlightHelmet_Materials_RubberWoodMat_BaseColor.png" + }, + { + "sampler": 0, + "source": 3, + "name": "FlightHelmet_Materials_GlassPlasticMat_Normal.png" + }, + { + "sampler": 0, + "source": 4, + "name": "FlightHelmet_Materials_GlassPlasticMat_OcclusionRoughMetal.png" + }, + { + "sampler": 0, + "source": 5, + "name": "FlightHelmet_Materials_GlassPlasticMat_BaseColor.png" + }, + { + "sampler": 0, + "source": 6, + "name": "FlightHelmet_Materials_MetalPartsMat_Normal.png" + }, + { + "sampler": 0, + "source": 7, + "name": "FlightHelmet_Materials_MetalPartsMat_OcclusionRoughMetal.png" + }, + { + "sampler": 0, + "source": 8, + "name": "FlightHelmet_Materials_MetalPartsMat_BaseColor.png" + }, + { + "sampler": 0, + "source": 9, + "name": "FlightHelmet_Materials_LeatherPartsMat_Normal.png" + }, + { + "sampler": 0, + "source": 10, + "name": "FlightHelmet_Materials_LeatherPartsMat_OcclusionRoughMetal.png" + }, + { + "sampler": 0, + "source": 11, + "name": "FlightHelmet_Materials_LeatherPartsMat_BaseColor.png" + }, + { + "sampler": 0, + "source": 12, + "name": "FlightHelmet_Materials_LensesMat_Normal.png" + }, + { + "sampler": 0, + "source": 13, + "name": "FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png" + }, + { + "sampler": 0, + "source": 14, + "name": "FlightHelmet_Materials_LensesMat_BaseColor.png" + } + ], + "images": [ + { + "uri": "FlightHelmet_Materials_RubberWoodMat_Normal.png" + }, + { + "uri": "FlightHelmet_Materials_RubberWoodMat_OcclusionRoughMetal.png" + }, + { + "uri": "FlightHelmet_Materials_RubberWoodMat_BaseColor.png" + }, + { + "uri": "FlightHelmet_Materials_GlassPlasticMat_Normal.png" + }, + { + "uri": "FlightHelmet_Materials_GlassPlasticMat_OcclusionRoughMetal.png" + }, + { + "uri": "FlightHelmet_Materials_GlassPlasticMat_BaseColor.png" + }, + { + "uri": "FlightHelmet_Materials_MetalPartsMat_Normal.png" + }, + { + "uri": "FlightHelmet_Materials_MetalPartsMat_OcclusionRoughMetal.png" + }, + { + "uri": "FlightHelmet_Materials_MetalPartsMat_BaseColor.png" + }, + { + "uri": "FlightHelmet_Materials_LeatherPartsMat_Normal.png" + }, + { + "uri": "FlightHelmet_Materials_LeatherPartsMat_OcclusionRoughMetal.png" + }, + { + "uri": "FlightHelmet_Materials_LeatherPartsMat_BaseColor.png" + }, + { + "uri": "FlightHelmet_Materials_LensesMat_Normal.png" + }, + { + "uri": "FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png" + }, + { + "uri": "FlightHelmet_Materials_LensesMat_BaseColor.png" + } + ], + "samplers": [ + { + "magFilter": 9729, + "minFilter": 9987 + } + ] +} diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_GlassPlasticMat_BaseColor.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_GlassPlasticMat_BaseColor.png new file mode 100644 index 0000000000..f79eafe421 Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_GlassPlasticMat_BaseColor.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_GlassPlasticMat_Normal.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_GlassPlasticMat_Normal.png new file mode 100644 index 0000000000..06e70ef10b Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_GlassPlasticMat_Normal.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_GlassPlasticMat_OcclusionRoughMetal.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_GlassPlasticMat_OcclusionRoughMetal.png new file mode 100644 index 0000000000..3a03d7bb2a Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_GlassPlasticMat_OcclusionRoughMetal.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LeatherPartsMat_BaseColor.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LeatherPartsMat_BaseColor.png new file mode 100644 index 0000000000..dbee2d41ac Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LeatherPartsMat_BaseColor.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LeatherPartsMat_Normal.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LeatherPartsMat_Normal.png new file mode 100644 index 0000000000..467e2ca918 Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LeatherPartsMat_Normal.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LeatherPartsMat_OcclusionRoughMetal.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LeatherPartsMat_OcclusionRoughMetal.png new file mode 100644 index 0000000000..24058ff8fc Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LeatherPartsMat_OcclusionRoughMetal.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LensesMat_BaseColor.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LensesMat_BaseColor.png new file mode 100644 index 0000000000..81b29d8e5e Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LensesMat_BaseColor.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LensesMat_Normal.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LensesMat_Normal.png new file mode 100644 index 0000000000..ed6502e341 Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LensesMat_Normal.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png new file mode 100644 index 0000000000..bc7dd395a1 Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_LensesMat_OcclusionRoughMetal.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_MetalPartsMat_BaseColor.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_MetalPartsMat_BaseColor.png new file mode 100644 index 0000000000..33b9159225 Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_MetalPartsMat_BaseColor.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_MetalPartsMat_Normal.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_MetalPartsMat_Normal.png new file mode 100644 index 0000000000..b977bac8ca Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_MetalPartsMat_Normal.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_MetalPartsMat_OcclusionRoughMetal.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_MetalPartsMat_OcclusionRoughMetal.png new file mode 100644 index 0000000000..9cde90c325 Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_MetalPartsMat_OcclusionRoughMetal.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_RubberWoodMat_BaseColor.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_RubberWoodMat_BaseColor.png new file mode 100644 index 0000000000..c60cc95646 Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_RubberWoodMat_BaseColor.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_RubberWoodMat_Normal.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_RubberWoodMat_Normal.png new file mode 100644 index 0000000000..bc5669cf8a Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_RubberWoodMat_Normal.png differ diff --git a/assets/examples/models/FlightHelmet/FlightHelmet_Materials_RubberWoodMat_OcclusionRoughMetal.png b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_RubberWoodMat_OcclusionRoughMetal.png new file mode 100644 index 0000000000..f846b05516 Binary files /dev/null and b/assets/examples/models/FlightHelmet/FlightHelmet_Materials_RubberWoodMat_OcclusionRoughMetal.png differ diff --git a/assets/examples/models/SimpleSkin/SimpleSkin.gltf b/assets/examples/models/SimpleSkin/SimpleSkin.gltf new file mode 100644 index 0000000000..6e68616c72 --- /dev/null +++ b/assets/examples/models/SimpleSkin/SimpleSkin.gltf @@ -0,0 +1 @@ +{"scenes":[{"nodes":[0]}],"nodes":[{"skin":0,"mesh":0,"children":[1]},{"children":[2],"translation":[0,1,0]},{"rotation":[0,0,0,1]}],"meshes":[{"primitives":[{"attributes":{"POSITION":1,"JOINTS_0":2,"WEIGHTS_0":3},"indices":0}]}],"skins":[{"inverseBindMatrices":4,"joints":[1,2]}],"animations":[{"channels":[{"sampler":0,"target":{"node":2,"path":"rotation"}}],"samplers":[{"input":5,"interpolation":"LINEAR","output":6}]}],"buffers":[{"uri":"data:application/gltf-buffer;base64,AAABAAMAAAADAAIAAgADAAUAAgAFAAQABAAFAAcABAAHAAYABgAHAAkABgAJAAgAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAD8AAAAAAACAPwAAAD8AAAAAAAAAAAAAgD8AAAAAAACAPwAAgD8AAAAAAAAAAAAAwD8AAAAAAACAPwAAwD8AAAAAAAAAAAAAAEAAAAAAAACAPwAAAEAAAAAA","byteLength":168},{"uri":"data:application/gltf-buffer;base64,AAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAABAPwAAgD4AAAAAAAAAAAAAQD8AAIA+AAAAAAAAAAAAAAA/AAAAPwAAAAAAAAAAAAAAPwAAAD8AAAAAAAAAAAAAgD4AAEA/AAAAAAAAAAAAAIA+AABAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAA=","byteLength":320},{"uri":"data:application/gltf-buffer;base64,AACAPwAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAvwAAgL8AAAAAAACAPwAAgD8AAAAAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAAL8AAIC/AAAAAAAAgD8=","byteLength":128},{"uri":"data:application/gltf-buffer;base64,AAAAAAAAAD8AAIA/AADAPwAAAEAAACBAAABAQAAAYEAAAIBAAACQQAAAoEAAALBAAAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAkxjEPkSLbD8AAAAAAAAAAPT9ND/0/TQ/AAAAAAAAAAD0/TQ/9P00PwAAAAAAAAAAkxjEPkSLbD8AAAAAAAAAAAAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAkxjEvkSLbD8AAAAAAAAAAPT9NL/0/TQ/AAAAAAAAAAD0/TS/9P00PwAAAAAAAAAAkxjEvkSLbD8AAAAAAAAAAAAAAAAAAIA/","byteLength":240}],"bufferViews":[{"buffer":0,"byteOffset":0,"byteLength":48,"target":34963},{"buffer":0,"byteOffset":48,"byteLength":120,"target":34962},{"buffer":1,"byteOffset":0,"byteLength":320,"byteStride":16},{"buffer":2,"byteOffset":0,"byteLength":128},{"buffer":3,"byteOffset":0,"byteLength":240}],"accessors":[{"bufferView":0,"byteOffset":0,"componentType":5123,"count":24,"type":"SCALAR","max":[9],"min":[0]},{"bufferView":1,"byteOffset":0,"componentType":5126,"count":10,"type":"VEC3","max":[1,2,0],"min":[0,0,0]},{"bufferView":2,"byteOffset":0,"componentType":5123,"count":10,"type":"VEC4","max":[0,1,0,0],"min":[0,1,0,0]},{"bufferView":2,"byteOffset":160,"componentType":5126,"count":10,"type":"VEC4","max":[1,1,0,0],"min":[0,0,0,0]},{"bufferView":3,"byteOffset":0,"componentType":5126,"count":2,"type":"MAT4","max":[1,0,0,0,0,1,0,0,0,0,1,0,-0.5,-1,0,1],"min":[1,0,0,0,0,1,0,0,0,0,1,0,-0.5,-1,0,1]},{"bufferView":4,"byteOffset":0,"componentType":5126,"count":12,"type":"SCALAR","max":[5.5],"min":[0]},{"bufferView":4,"byteOffset":48,"componentType":5126,"count":12,"type":"VEC4","max":[0,0,0.707,1],"min":[0,0,-0.707,0.707]}],"asset":{"version":"2.0"}} \ No newline at end of file diff --git a/assets/examples/models/animated/Fox.glb b/assets/examples/models/animated/Fox.glb new file mode 100644 index 0000000000..2bb946e2d4 Binary files /dev/null and b/assets/examples/models/animated/Fox.glb differ diff --git a/assets/examples/models/animated/MorphStressTest.gltf b/assets/examples/models/animated/MorphStressTest.gltf new file mode 100644 index 0000000000..1576ee5822 --- /dev/null +++ b/assets/examples/models/animated/MorphStressTest.gltf @@ -0,0 +1,1055 @@ +{ + "asset":{ + "generator":"Khronos glTF Blender I/O v3.6.11", + "version":"2.0" + }, + "scene":0, + "scenes":[ + { + "name":"Scene", + "nodes":[ + 0 + ] + } + ], + "nodes":[ + { + "mesh":0, + "name":"Main" + } + ], + "animations":[ + { + "channels":[ + { + "sampler":0, + "target":{ + "node":0, + "path":"weights" + } + } + ], + "name":"Individuals", + "samplers":[ + { + "input":42, + "interpolation":"LINEAR", + "output":43 + } + ] + }, + { + "channels":[ + { + "sampler":0, + "target":{ + "node":0, + "path":"weights" + } + } + ], + "name":"Pulse", + "samplers":[ + { + "input":44, + "interpolation":"LINEAR", + "output":45 + } + ] + }, + { + "channels":[ + { + "sampler":0, + "target":{ + "node":0, + "path":"weights" + } + } + ], + "name":"TheWave", + "samplers":[ + { + "input":46, + "interpolation":"LINEAR", + "output":47 + } + ] + } + ], + "materials":[ + { + "doubleSided":true, + "name":"Base", + "occlusionTexture":{ + "index":0, + "texCoord":1 + }, + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":1 + }, + "metallicFactor":0, + "roughnessFactor":0.4000000059604645 + } + }, + { + "doubleSided":true, + "name":"TestMaterial", + "pbrMetallicRoughness":{ + "baseColorTexture":{ + "index":2 + }, + "metallicFactor":0, + "roughnessFactor":0.5 + } + } + ], + "meshes":[ + { + "extras":{ + "targetNames":[ + "Key 1", + "Key 2", + "Key 3", + "Key 4", + "Key 5", + "Key 6", + "Key 7", + "Key 8" + ] + }, + "name":"Cube.001", + "primitives":[ + { + "attributes":{ + "POSITION":0, + "NORMAL":1, + "TEXCOORD_0":2, + "TEXCOORD_1":3 + }, + "indices":4, + "material":0, + "targets":[ + { + "POSITION":5, + "NORMAL":6 + }, + { + "POSITION":7, + "NORMAL":8 + }, + { + "POSITION":9, + "NORMAL":10 + }, + { + "POSITION":11, + "NORMAL":12 + }, + { + "POSITION":13, + "NORMAL":14 + }, + { + "POSITION":15, + "NORMAL":16 + }, + { + "POSITION":17, + "NORMAL":18 + }, + { + "POSITION":19, + "NORMAL":20 + } + ] + }, + { + "attributes":{ + "POSITION":21, + "NORMAL":22, + "TEXCOORD_0":23, + "TEXCOORD_1":24 + }, + "indices":25, + "material":1, + "targets":[ + { + "POSITION":26, + "NORMAL":27 + }, + { + "POSITION":28, + "NORMAL":29 + }, + { + "POSITION":30, + "NORMAL":31 + }, + { + "POSITION":32, + "NORMAL":33 + }, + { + "POSITION":34, + "NORMAL":35 + }, + { + "POSITION":36, + "NORMAL":37 + }, + { + "POSITION":38, + "NORMAL":39 + }, + { + "POSITION":40, + "NORMAL":41 + } + ] + } + ], + "weights":[ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + } + ], + "textures":[ + { + "sampler":0, + "source":0 + }, + { + "sampler":0, + "source":1 + }, + { + "sampler":0, + "source":2 + } + ], + "images":[ + { + "bufferView":5, + "mimeType":"image/png", + "name":"Base_AO" + }, + { + "bufferView":6, + "mimeType":"image/png", + "name":"TinyGrid" + }, + { + "bufferView":28, + "mimeType":"image/png", + "name":"ColorSwatches" + } + ], + "accessors":[ + { + "bufferView":0, + "componentType":5126, + "count":24, + "max":[ + 2, + 0, + 0.5 + ], + "min":[ + -2, + -0.10000002384185791, + -0.5 + ], + "type":"VEC3" + }, + { + "bufferView":1, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":2, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":3, + "componentType":5126, + "count":24, + "type":"VEC2" + }, + { + "bufferView":4, + "componentType":5123, + "count":36, + "type":"SCALAR" + }, + { + "bufferView":7, + "componentType":5126, + "count":24, + "max":[ + 0, + 0, + 0 + ], + "min":[ + 0, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":8, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":9, + "componentType":5126, + "count":24, + "max":[ + 0, + 0, + 0 + ], + "min":[ + 0, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":10, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":11, + "componentType":5126, + "count":24, + "max":[ + 0, + 0, + 0 + ], + "min":[ + 0, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":12, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":13, + "componentType":5126, + "count":24, + "max":[ + 0, + 0, + 0 + ], + "min":[ + 0, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":14, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":15, + "componentType":5126, + "count":24, + "max":[ + 0, + 0, + 0 + ], + "min":[ + 0, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":16, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":17, + "componentType":5126, + "count":24, + "max":[ + 0, + 0, + 0 + ], + "min":[ + 0, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":18, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":19, + "componentType":5126, + "count":24, + "max":[ + 0, + 0, + 0 + ], + "min":[ + 0, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":20, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":21, + "componentType":5126, + "count":24, + "max":[ + 0, + 0, + 0 + ], + "min":[ + 0, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":22, + "componentType":5126, + "count":24, + "type":"VEC3" + }, + { + "bufferView":23, + "componentType":5126, + "count":1504, + "max":[ + 1.875, + 0.5, + 0.25 + ], + "min":[ + -1.875, + 0, + -0.25 + ], + "type":"VEC3" + }, + { + "bufferView":24, + "componentType":5126, + "count":1504, + "type":"VEC3" + }, + { + "bufferView":25, + "componentType":5126, + "count":1504, + "type":"VEC2" + }, + { + "bufferView":26, + "componentType":5126, + "count":1504, + "type":"VEC2" + }, + { + "bufferView":27, + "componentType":5123, + "count":7200, + "type":"SCALAR" + }, + { + "bufferView":29, + "componentType":5126, + "count":1504, + "max":[ + 0.04999995231628418, + 1, + 0 + ], + "min":[ + -0.04999995231628418, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":30, + "componentType":5126, + "count":1504, + "type":"VEC3" + }, + { + "bufferView":31, + "componentType":5126, + "count":1504, + "max":[ + 0.04999995231628418, + 1, + 0 + ], + "min":[ + -0.04999995231628418, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":32, + "componentType":5126, + "count":1504, + "type":"VEC3" + }, + { + "bufferView":33, + "componentType":5126, + "count":1504, + "max":[ + 0.050000011920928955, + 1, + 0 + ], + "min":[ + -0.050000011920928955, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":34, + "componentType":5126, + "count":1504, + "type":"VEC3" + }, + { + "bufferView":35, + "componentType":5126, + "count":1504, + "max":[ + 0.050000011920928955, + 1, + 0 + ], + "min":[ + -0.04999999701976776, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":36, + "componentType":5126, + "count":1504, + "type":"VEC3" + }, + { + "bufferView":37, + "componentType":5126, + "count":1504, + "max":[ + 0.04999999701976776, + 1, + 0 + ], + "min":[ + -0.050000011920928955, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":38, + "componentType":5126, + "count":1504, + "type":"VEC3" + }, + { + "bufferView":39, + "componentType":5126, + "count":1504, + "max":[ + 0.050000011920928955, + 1, + 0 + ], + "min":[ + -0.050000011920928955, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":40, + "componentType":5126, + "count":1504, + "type":"VEC3" + }, + { + "bufferView":41, + "componentType":5126, + "count":1504, + "max":[ + 0.04999995231628418, + 1, + 0 + ], + "min":[ + -0.04999995231628418, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":42, + "componentType":5126, + "count":1504, + "type":"VEC3" + }, + { + "bufferView":43, + "componentType":5126, + "count":1504, + "max":[ + 0.04999995231628418, + 1, + 0 + ], + "min":[ + -0.04999995231628418, + 0, + 0 + ], + "type":"VEC3" + }, + { + "bufferView":44, + "componentType":5126, + "count":1504, + "type":"VEC3" + }, + { + "bufferView":45, + "componentType":5126, + "count":225, + "max":[ + 9.333333333333334 + ], + "min":[ + 0 + ], + "type":"SCALAR" + }, + { + "bufferView":46, + "componentType":5126, + "count":1800, + "type":"SCALAR" + }, + { + "bufferView":47, + "componentType":5126, + "count":153, + "max":[ + 6.333333333333333 + ], + "min":[ + 0 + ], + "type":"SCALAR" + }, + { + "bufferView":48, + "componentType":5126, + "count":1224, + "type":"SCALAR" + }, + { + "bufferView":49, + "componentType":5126, + "count":48, + "max":[ + 1.9583333333333333 + ], + "min":[ + 0 + ], + "type":"SCALAR" + }, + { + "bufferView":50, + "componentType":5126, + "count":384, + "type":"SCALAR" + } + ], + "bufferViews":[ + { + "buffer":0, + "byteLength":288, + "byteOffset":0, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":288, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":576, + "target":34962 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":768, + "target":34962 + }, + { + "buffer":0, + "byteLength":72, + "byteOffset":960, + "target":34963 + }, + { + "buffer":0, + "byteLength":178434, + "byteOffset":1032 + }, + { + "buffer":0, + "byteLength":186, + "byteOffset":179468 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":179656, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":179944, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":180232, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":180520, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":180808, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":181096, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":181384, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":181672, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":181960, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":182248, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":182536, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":182824, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":183112, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":183400, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":183688, + "target":34962 + }, + { + "buffer":0, + "byteLength":288, + "byteOffset":183976, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":184264, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":202312, + "target":34962 + }, + { + "buffer":0, + "byteLength":12032, + "byteOffset":220360, + "target":34962 + }, + { + "buffer":0, + "byteLength":12032, + "byteOffset":232392, + "target":34962 + }, + { + "buffer":0, + "byteLength":14400, + "byteOffset":244424, + "target":34963 + }, + { + "buffer":0, + "byteLength":208, + "byteOffset":258824 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":259032, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":277080, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":295128, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":313176, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":331224, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":349272, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":367320, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":385368, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":403416, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":421464, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":439512, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":457560, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":475608, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":493656, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":511704, + "target":34962 + }, + { + "buffer":0, + "byteLength":18048, + "byteOffset":529752, + "target":34962 + }, + { + "buffer":0, + "byteLength":900, + "byteOffset":547800 + }, + { + "buffer":0, + "byteLength":7200, + "byteOffset":548700 + }, + { + "buffer":0, + "byteLength":612, + "byteOffset":555900 + }, + { + "buffer":0, + "byteLength":4896, + "byteOffset":556512 + }, + { + "buffer":0, + "byteLength":192, + "byteOffset":561408 + }, + { + "buffer":0, + "byteLength":1536, + "byteOffset":561600 + } + ], + "samplers":[ + { + "magFilter":9729, + "minFilter":9987 + } + ], + "buffers":[ + { + "byteLength":563136, + "uri":"data:application/octet-stream;base64,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AAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAA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TQA8AE0ASQA9AD4AQAA9AEAATQA3AEMARgA3AEYARQBDAEQARwBDAEcARgBFAEYAPwBFAD8AOwBGAEcAQgBGAEIAPwA4AEgATAA4AEwASwBIAEoATgBIAE4ATABLAEwARwBLAEcARABMAE4AQQBMAEEARwBPAFIAVgBPAFYAVQBSAFQAWABSAFgAVgBVAFYAZwBVAGcAYwBWAFgAWwBWAFsAZwBQAFwAXwBQAF8AXgBcAF0AYABcAGAAXwBeAF8AVwBeAFcAUwBfAGAAWQBfAFkAVwBRAGEAZQBRAGUAZABhAGIAZgBhAGYAZQBkAGUAYABkAGAAXQBlAGYAWgBlAFoAYABoAGsAbgBoAG4AbQBrAGwAbwBrAG8AbgBtAG4AewBtAHsAdwBuAG8AcABuAHAAewBpAHEAdABpAHQAcwBxAHIAdQBxAHUAdABzAHQAbwBzAG8AbAB0AHUAcAB0AHAAbwBqAHYAegBqAHoAeQB2AHgAfAB2AHwAegB5AHoAdQB5AHUAcgB6AHwAcAB6AHAAdQB9AIAAhAB9AIQAgwCAAIIAhgCAAIYAhACDAIQAkQCDAJEAjgCEAIYAhwCEAIcAkQB+AIgAiwB+AIsAigCIAIkAjACIAIwAiwCKAIsAhQCKAIUAgQCLAIwAhwCLAIcAhQB/AI0AkAB/AJAAjwCNAI4AkQCNAJEAkACPAJAAjACPAIwAiQCQAJEAhwCQAIcAjACSAJUAmQCSAJkAmACVAJYAmgCVAJoAmQCYAJkApgCYAKYAowCZAJoAnACZAJwApgCTAJ0AoACTAKAAnwCdAJ4AoQCdAKEAoACfAKAAmwCfAJsAlwCgAKEAnACgAJwAmwCUAKIApQCUAKUApACiAKMApgCiAKYApQCkAKUAoQCkAKEAngClAKYAnAClAJwAoQCnAKoArQCnAK0ArACqAKsArgCqAK4ArQCsAK0AuwCsALsAtwCtAK4ArwCtAK8AuwCoALAAswCoALMAsgCwALEAtACwALQAswCyALMArgCyAK4AqwCzALQArwCzAK8ArgCpALUAuQCpALkAuAC1ALYAugC1ALoAuQC4ALkAtAC4ALQAsQC5ALoArwC5AK8AtAA2AAAABgA2AAYAOQA5AAYAFQA5ABUAOgA7ABYAFAA7ABQARQBFABQAAgBFAAIANwABABsAIQABACEADQANACEAMAANADAADgAPADEALwAPAC8AFwAXAC8AHQAXAB0AAgAcAE8AVQAcAFUAKAAoAFUAYwAoAGMAKgApAGIAYQApAGEAMgAyAGEAUQAyAFEAHQBQADgASwBQAEsAXABcAEsARABcAEQAXQBdAEQAQwBdAEMAZABkAEMANwBkADcAUQCSADYAPACSADwAlQCVADwASQCVAEkAlgCXAEoASACXAEgAnwCfAEgAOACfADgAkwBPAKcArABPAKwAUgBSAKwAtwBSALcAVABTALYAtQBTALUAXgBeALUAqQBeAKkAUACoAJQApACoAKQAsACwAKQAngCwAJ4AsQCxAJ4AnQCxAJ0AuAC4AJ0AkwC4AJMAqQBoAJIAmABoAJgAawBrAJgAowBrAKMAbABsAKMAogBsAKIAcwBzAKIAlABzAJQAaQCnAH0AgwCnAIMAqgCqAIMAjgCqAI4AqwCrAI4AjQCrAI0AsgCyAI0AfwCyAH8AqAB+AGoAeQB+AHkAiACIAHkAcgCIAHIAiQCJAHIAcQCJAHEAjwCPAHEAaQCPAGkAfwAAAGgAbQAAAG0AAwADAG0AdwADAHcABAAFAHgAdgAFAHYAEAAQAHYAagAQAGoAAQB9ABwAKwB9ACsAgACAACsAIACAACAAggCBAB8AHgCBAB4AigCKAB4AGwCKABsAfgA2AJIAaAA2AGgAAAAmAToB1wAmAdcAvQBQAWQBOwFQATsBJQFjAQsB2ABjAdgAOQG+ANkADQG+AA0B8wD0AAwBZQH0AGUBTwG8AL8AwwC8AMMAwgC/AMAAxAC/AMQAwwDCAMMA1QDCANUA0QDDAMQAxgDDAMYA1QC9AMkAzQC9AM0AzADJAMoAzgDJAM4AzQDMAM0AxQDMAMUAwQDNAM4AyADNAMgAxQC+ANAA1AC+ANQA0wDQANIA1gDQANYA1ADTANQAzwDTAM8AywDUANYAxwDUAMcAzwDXANoA3gDXAN4A3QDaANsA3wDaAN8A3gDdAN4A8ADdAPAA7ADeAN8A4gDeAOIA8ADYAOQA6ADYAOgA5wDkAOYA6gDkAOoA6ADnAOgA4ADnAOAA3ADoAOoA4wDoAOMA4ADZAOsA7wDZAO8A7gDrAO0A8QDrAPEA7wDuAO8A6QDuAOkA5QDvAPEA4QDvAOEA6QDyAPUA+QDyAPkA+AD1APYA+gD1APoA+QD4APkACQH4AAkBBQH5APoA/AD5APwACQHzAP8AAgHzAAIBAQH/AAABAwH/AAMBAgEBAQIB+wABAfsA9wACAQMB/gACAf4A+wD0AAQBCAH0AAgBBwEEAQYBCgEEAQoBCAEHAQgBAwEHAQMBAAEIAQoB/QAIAf0AAwELAQ4BEgELARIBEQEOARABFAEOARQBEgERARIBIwERASMBHwESARQBFwESARcBIwEMARgBGwEMARsBGgEYARkBHAEYARwBGwEaARsBEwEaARMBDwEbARwBFQEbARUBEwENAR0BIQENASEBIAEdAR4BIgEdASIBIQEgASEBHAEgARwBGQEhASIBFgEhARYBHAEkAScBKgEkASoBKQEnASgBKwEnASsBKgEpASoBNwEpATcBMwEqASsBLAEqASwBNwElAS0BMAElATABLwEtAS4BMQEtATEBMAEvATABKwEvASsBKAEwATEBLAEwASwBKwEmATIBNgEmATYBNQEyATQBOAEyATgBNgE1ATYBMQE1ATEBLgE2ATgBLAE2ASwBMQE5ATwBQAE5AUABPwE8AT4BQgE8AUIBQAE/AUABTQE/AU0BSgFAAUIBQwFAAUMBTQE6AUQBRwE6AUcBRgFEAUUBSAFEAUgBRwFGAUcBQQFGAUEBPQFHAUgBQwFHAUMBQQE7AUkBTAE7AUwBSwFJAUoBTQFJAU0BTAFLAUwBSAFLAUgBRQFMAU0BQwFMAUMBSAFOAVEBVQFOAVUBVAFRAVIBVgFRAVYBVQFUAVUBYgFUAWIBXwFVAVYBWAFVAVgBYgFPAVkBXAFPAVwBWwFZAVoBXQFZAV0BXAFbAVwBVwFbAVcBUwFcAV0BWAFcAVgBVwFQAV4BYQFQAWEBYAFeAV8BYgFeAWIBYQFgAWEBXQFgAV0BWgFhAWIBWAFhAVgBXQFjAWYBaQFjAWkBaAFmAWcBagFmAWoBaQFoAWkBdwFoAXcBcwFpAWoBawFpAWsBdwFkAWwBbwFkAW8BbgFsAW0BcAFsAXABbwFuAW8BagFuAWoBZwFvAXABawFvAWsBagFlAXEBdQFlAXUBdAFxAXIBdgFxAXYBdQF0AXUBcAF0AXABbQF1AXYBawF1AWsBcAHyALwAwgDyAMIA9QD1AMIA0QD1ANEA9gD3ANIA0AD3ANAAAQEBAdAAvgABAb4A8wC9ANcA3QC9AN0AyQDJAN0A7ADJAOwAygDLAO0A6wDLAOsA0wDTAOsA2QDTANkAvgDYAAsBEQHYABEB5ADkABEBHwHkAB8B5gDlAB4BHQHlAB0B7gDuAB0BDQHuAA0B2QAMAfQABwEMAQcBGAEYAQcBAAEYAQABGQEZAQAB/wAZAf8AIAEgAf8A8wAgAfMADQFOAfIA+ABOAfgAUQFRAfgABQFRAQUBUgFTAQYBBAFTAQQBWwFbAQQB9ABbAfQATwELAWMBaAELAWgBDgEOAWgBcwEOAXMBEAEPAXIBcQEPAXEBGgEaAXEBZQEaAWUBDAFkAVABYAFkAWABbAFsAWABWgFsAVoBbQFtAVoBWQFtAVkBdAF0AVkBTwF0AU8BZQEkAU4BVAEkAVQBJwEnAVQBXwEnAV8BKAEoAV8BXgEoAV4BLwEvAV4BUAEvAVABJQFjATkBPwFjAT8BZgFmAT8BSgFmAUoBZwFnAUoBSQFnAUkBbgFuAUkBOwFuATsBZAE6ASYBNQE6ATUBRAFEATUBLgFEAS4BRQFFAS4BLQFFAS0BSwFLAS0BJQFLASUBOwG8ACQBKQG8ACkBvwC/ACkBMwG/ADMBwADBADQBMgHBADIBzADMADIBJgHMACYBvQA5AdgA5wA5AecAPAE8AecA3AA8AdwAPgE9AdsA2gA9AdoARgFGAdoA1wBGAdcAOgHyAE4BJAHyACQBvADiAfYBkwHiAZMBeQEMAiAC9wEMAvcB4QEfAscBlAEfApQB9QF6AZUByQF6AckBrwGwAcgBIQKwASECCwJ4AXsBfwF4AX8BfgF7AXwBgAF7AYABfwF+AX8BkQF+AZEBjQF/AYABggF/AYIBkQF5AYUBiQF5AYkBiAGFAYYBigGFAYoBiQGIAYkBgQGIAYEBfQGJAYoBhAGJAYQBgQF6AYwBkAF6AZABjwGMAY4BkgGMAZIBkAGPAZABiwGPAYsBhwGQAZIBgwGQAYMBiwGTAZYBmgGTAZoBmQGWAZcBmwGWAZsBmgGZAZoBrAGZAawBqAGaAZsBngGaAZ4BrAGUAaABpAGUAaQBowGgAaIBpgGgAaYBpAGjAaQBnAGjAZwBmAGkAaYBnwGkAZ8BnAGVAacBqwGVAasBqgGnAakBrQGnAa0BqwGqAasBpQGqAaUBoQGrAa0BnQGrAZ0BpQGuAbEBtQGuAbUBtAGxAbIBtgGxAbYBtQG0AbUBxQG0AcUBwQG1AbYBuAG1AbgBxQGvAbsBvgGvAb4BvQG7AbwBvwG7Ab8BvgG9Ab4BtwG9AbcBswG+Ab8BugG+AboBtwGwAcABxAGwAcQBwwHAAcIBxgHAAcYBxAHDAcQBvwHDAb8BvAHEAcYBuQHEAbkBvwHHAcoBzgHHAc4BzQHKAcwB0AHKAdABzgHNAc4B3wHNAd8B2wHOAdAB0wHOAdMB3wHIAdQB1wHIAdcB1gHUAdUB2AHUAdgB1wHWAdcBzwHWAc8BywHXAdgB0QHXAdEBzwHJAdkB3QHJAd0B3AHZAdoB3gHZAd4B3QHcAd0B2AHcAdgB1QHdAd4B0gHdAdIB2AHgAeMB5gHgAeYB5QHjAeQB5wHjAecB5gHlAeYB8wHlAfMB7wHmAecB6AHmAegB8wHhAekB7AHhAewB6wHpAeoB7QHpAe0B7AHrAewB5wHrAecB5AHsAe0B6AHsAegB5wHiAe4B8gHiAfIB8QHuAfAB9AHuAfQB8gHxAfIB7QHxAe0B6gHyAfQB6AHyAegB7QH1AfgB/AH1AfwB+wH4AfoB/gH4Af4B/AH7AfwBCQL7AQkCBgL8Af4B/wH8Af8BCQL2AQACAwL2AQMCAgIAAgECBAIAAgQCAwICAgMC/QECAv0B+QEDAgQC/wEDAv8B/QH3AQUCCAL3AQgCBwIFAgYCCQIFAgkCCAIHAggCBAIHAgQCAQIIAgkC/wEIAv8BBAIKAg0CEQIKAhECEAINAg4CEgINAhICEQIQAhECHgIQAh4CGwIRAhICFAIRAhQCHgILAhUCGAILAhgCFwIVAhYCGQIVAhkCGAIXAhgCEwIXAhMCDwIYAhkCFAIYAhQCEwIMAhoCHQIMAh0CHAIaAhsCHgIaAh4CHQIcAh0CGQIcAhkCFgIdAh4CFAIdAhQCGQIfAiICJQIfAiUCJAIiAiMCJgIiAiYCJQIkAiUCMwIkAjMCLwIlAiYCJwIlAicCMwIgAigCKwIgAisCKgIoAikCLAIoAiwCKwIqAisCJgIqAiYCIwIrAiwCJwIrAicCJgIhAi0CMQIhAjECMAItAi4CMgItAjICMQIwAjECLAIwAiwCKQIxAjICJwIxAicCLAKuAXgBfgGuAX4BsQGxAX4BjQGxAY0BsgGzAY4BjAGzAYwBvQG9AYwBegG9AXoBrwF5AZMBmQF5AZkBhQGFAZkBqAGFAagBhgGHAakBpwGHAacBjwGPAacBlQGPAZUBegGUAccBzQGUAc0BoAGgAc0B2wGgAdsBogGhAdoB2QGhAdkBqgGqAdkByQGqAckBlQHIAbABwwHIAcMB1AHUAcMBvAHUAbwB1QHVAbwBuwHVAbsB3AHcAbsBrwHcAa8ByQEKAq4BtAEKArQBDQINArQBwQENAsEBDgIPAsIBwAEPAsABFwIXAsABsAEXArABCwLHAR8CJALHASQCygHKASQCLwLKAS8CzAHLAS4CLQLLAS0C1gHWAS0CIQLWASECyAEgAgwCHAIgAhwCKAIoAhwCFgIoAhYCKQIpAhYCFQIpAhUCMAIwAhUCCwIwAgsCIQLgAQoCEALgARAC4wHjARACGwLjARsC5AHkARsCGgLkARoC6wHrARoCDALrAQwC4QEfAvUB+wEfAvsBIgIiAvsBBgIiAgYCIwIjAgYCBQIjAgUCKgIqAgUC9wEqAvcBIAL2AeIB8QH2AfEBAAIAAvEB6gEAAuoBAQIBAuoB6QEBAukBBwIHAukB4QEHAuEB9wF4AeAB5QF4AeUBewF7AeUB7wF7Ae8BfAF9AfAB7gF9Ae4BiAGIAe4B4gGIAeIBeQH1AZQBowH1AaMB+AH4AaMBmAH4AZgB+gH5AZcBlgH5AZYBAgICApYBkwECApMB9gGuAQoC4AGuAeABeAGeArICTwKeAk8CNQLIAtwCswLIArMCnQLbAoMCUALbAlACsQI2AlEChQI2AoUCawJsAoQC3QJsAt0CxwI0AjcCOwI0AjsCOgI3AjgCPAI3AjwCOwI6AjsCTQI6Ak0CSQI7AjwCPgI7Aj4CTQI1AkECRQI1AkUCRAJBAkICRgJBAkYCRQJEAkUCPQJEAj0COQJFAkYCQAJFAkACPQI2AkgCTAI2AkwCSwJIAkoCTgJIAk4CTAJLAkwCRwJLAkcCQwJMAk4CPwJMAj8CRwJPAlICVgJPAlYCVQJSAlMCVwJSAlcCVgJVAlYCaAJVAmgCZAJWAlcCWgJWAloCaAJQAlwCYAJQAmACXwJcAl4CYgJcAmICYAJfAmACWAJfAlgCVAJgAmICWwJgAlsCWAJRAmMCZwJRAmcCZgJjAmUCaQJjAmkCZwJmAmcCYQJmAmECXQJnAmkCWQJnAlkCYQJqAm0CcQJqAnECcAJtAm4CcgJtAnICcQJwAnECgQJwAoECfQJxAnICdAJxAnQCgQJrAncCegJrAnoCeQJ3AngCewJ3AnsCegJ5AnoCcwJ5AnMCbwJ6AnsCdgJ6AnYCcwJsAnwCgAJsAoACfwJ8An4CggJ8AoICgAJ/AoACewJ/AnsCeAKAAoICdQKAAnUCewKDAoYCigKDAooCiQKGAogCjAKGAowCigKJAooCmwKJApsClwKKAowCjwKKAo8CmwKEApACkwKEApMCkgKQApEClAKQApQCkwKSApMCiwKSAosChwKTApQCjQKTAo0CiwKFApUCmQKFApkCmAKVApYCmgKVApoCmQKYApkClAKYApQCkQKZApoCjgKZAo4ClAKcAp8CogKcAqICoQKfAqACowKfAqMCogKhAqICrwKhAq8CqwKiAqMCpAKiAqQCrwKdAqUCqAKdAqgCpwKlAqYCqQKlAqkCqAKnAqgCowKnAqMCoAKoAqkCpAKoAqQCowKeAqoCrgKeAq4CrQKqAqwCsAKqArACrgKtAq4CqQKtAqkCpgKuArACpAKuAqQCqQKxArQCuAKxArgCtwK0ArYCugK0AroCuAK3ArgCxQK3AsUCwgK4AroCuwK4ArsCxQKyArwCvwKyAr8CvgK8Ar0CwAK8AsACvwK+Ar8CuQK+ArkCtQK/AsACuwK/ArsCuQKzAsECxAKzAsQCwwLBAsICxQLBAsUCxALDAsQCwALDAsACvQLEAsUCuwLEArsCwALGAskCzQLGAs0CzALJAsoCzgLJAs4CzQLMAs0C2gLMAtoC1wLNAs4C0ALNAtAC2gLHAtEC1ALHAtQC0wLRAtIC1QLRAtUC1ALTAtQCzwLTAs8CywLUAtUC0ALUAtACzwLIAtYC2QLIAtkC2ALWAtcC2gLWAtoC2QLYAtkC1QLYAtUC0gLZAtoC0ALZAtAC1QLbAt4C4QLbAuEC4ALeAt8C4gLeAuIC4QLgAuEC7wLgAu8C6wLhAuIC4wLhAuMC7wLcAuQC5wLcAucC5gLkAuUC6ALkAugC5wLmAucC4gLmAuIC3wLnAugC4wLnAuMC4gLdAukC7QLdAu0C7ALpAuoC7gLpAu4C7QLsAu0C6ALsAugC5QLtAu4C4wLtAuMC6AJqAjQCOgJqAjoCbQJtAjoCSQJtAkkCbgJvAkoCSAJvAkgCeQJ5AkgCNgJ5AjYCawI1Ak8CVQI1AlUCQQJBAlUCZAJBAmQCQgJDAmUCYwJDAmMCSwJLAmMCUQJLAlECNgJQAoMCiQJQAokCXAJcAokClwJcApcCXgJdApYClQJdApUCZgJmApUChQJmAoUCUQKEAmwCfwKEAn8CkAKQAn8CeAKQAngCkQKRAngCdwKRAncCmAKYAncCawKYAmsChQLGAmoCcALGAnACyQLJAnACfQLJAn0CygLLAn4CfALLAnwC0wLTAnwCbALTAmwCxwKDAtsC4AKDAuAChgKGAuAC6wKGAusCiAKHAuoC6QKHAukCkgKSAukC3QKSAt0ChALcAsgC2ALcAtgC5ALkAtgC0gLkAtIC5QLlAtIC0QLlAtEC7ALsAtECxwLsAscC3QKcAsYCzAKcAswCnwKfAswC1wKfAtcCoAKgAtcC1gKgAtYCpwKnAtYCyAKnAsgCnQLbArECtwLbArcC3gLeArcCwgLeAsIC3wLfAsICwQLfAsEC5gLmAsECswLmArMC3AKyAp4CrQKyAq0CvAK8Aq0CpgK8AqYCvQK9AqYCpQK9AqUCwwLDAqUCnQLDAp0CswI0ApwCoQI0AqECNwI3AqECqwI3AqsCOAI5AqwCqgI5AqoCRAJEAqoCngJEAp4CNQKxAlACXwKxAl8CtAK0Al8CVAK0AlQCtgK1AlMCUgK1AlICvgK+AlICTwK+Ak8CsgJqAsYCnAJqApwCNAJaA24DCwNaAwsD8QKEA5gDbwOEA28DWQOXAz8DDAOXAwwDbQPyAg0DQQPyAkEDJwMoA0ADmQMoA5kDgwPwAvMC9wLwAvcC9gLzAvQC+ALzAvgC9wL2AvcCCQP2AgkDBQP3AvgC+gL3AvoCCQPxAv0CAQPxAgEDAAP9Av4CAgP9AgIDAQMAAwED+QIAA/kC9QIBAwID/AIBA/wC+QLyAgQDCAPyAggDBwMEAwYDCgMEAwoDCAMHAwgDAwMHAwMD/wIIAwoD+wIIA/sCAwMLAw4DEgMLAxIDEQMOAw8DEwMOAxMDEgMRAxIDJAMRAyQDIAMSAxMDFgMSAxYDJAMMAxgDHAMMAxwDGwMYAxoDHgMYAx4DHAMbAxwDFAMbAxQDEAMcAx4DFwMcAxcDFAMNAx8DIwMNAyMDIgMfAyEDJQMfAyUDIwMiAyMDHQMiAx0DGQMjAyUDFQMjAxUDHQMmAykDLQMmAy0DLAMpAyoDLgMpAy4DLQMsAy0DPQMsAz0DOQMtAy4DMAMtAzADPQMnAzMDNgMnAzYDNQMzAzQDNwMzAzcDNgM1AzYDLwM1Ay8DKwM2AzcDMgM2AzIDLwMoAzgDPAMoAzwDOwM4AzoDPgM4Az4DPAM7AzwDNwM7AzcDNAM8Az4DMQM8AzEDNwM/A0IDRgM/A0YDRQNCA0QDSANCA0gDRgNFA0YDVwNFA1cDUwNGA0gDSwNGA0sDVwNAA0wDTwNAA08DTgNMA00DUANMA1ADTwNOA08DRwNOA0cDQwNPA1ADSQNPA0kDRwNBA1EDVQNBA1UDVANRA1IDVgNRA1YDVQNUA1UDUANUA1ADTQNVA1YDSgNVA0oDUANYA1sDXgNYA14DXQNbA1wDXwNbA18DXgNdA14DawNdA2sDZwNeA18DYANeA2ADawNZA2EDZANZA2QDYwNhA2IDZQNhA2UDZANjA2QDXwNjA18DXANkA2UDYANkA2ADXwNaA2YDagNaA2oDaQNmA2gDbANmA2wDagNpA2oDZQNpA2UDYgNqA2wDYANqA2ADZQNtA3ADdANtA3QDcwNwA3IDdgNwA3YDdANzA3QDgQNzA4EDfgN0A3YDdwN0A3cDgQNuA3gDewNuA3sDegN4A3kDfAN4A3wDewN6A3sDdQN6A3UDcQN7A3wDdwN7A3cDdQNvA30DgANvA4ADfwN9A34DgQN9A4EDgAN/A4ADfAN/A3wDeQOAA4EDdwOAA3cDfAOCA4UDiQOCA4kDiAOFA4YDigOFA4oDiQOIA4kDlgOIA5YDkwOJA4oDjAOJA4wDlgODA40DkAODA5ADjwONA44DkQONA5EDkAOPA5ADiwOPA4sDhwOQA5EDjAOQA4wDiwOEA5IDlQOEA5UDlAOSA5MDlgOSA5YDlQOUA5UDkQOUA5EDjgOVA5YDjAOVA4wDkQOXA5oDnQOXA50DnAOaA5sDngOaA54DnQOcA50DqwOcA6sDpwOdA54DnwOdA58DqwOYA6ADowOYA6MDogOgA6EDpAOgA6QDowOiA6MDngOiA54DmwOjA6QDnwOjA58DngOZA6UDqQOZA6kDqAOlA6YDqgOlA6oDqQOoA6kDpAOoA6QDoQOpA6oDnwOpA58DpAMmA/AC9gImA/YCKQMpA/YCBQMpAwUDKgMrAwYDBAMrAwQDNQM1AwQD8gI1A/ICJwPxAgsDEQPxAhED/QL9AhEDIAP9AiAD/gL/AiEDHwP/Ah8DBwMHAx8DDQMHAw0D8gIMAz8DRQMMA0UDGAMYA0UDUwMYA1MDGgMZA1IDUQMZA1EDIgMiA1EDQQMiA0EDDQNAAygDOwNAAzsDTANMAzsDNANMAzQDTQNNAzQDMwNNAzMDVANUAzMDJwNUAycDQQOCAyYDLAOCAywDhQOFAywDOQOFAzkDhgOHAzoDOAOHAzgDjwOPAzgDKAOPAygDgwM/A5cDnAM/A5wDQgNCA5wDpwNCA6cDRANDA6YDpQNDA6UDTgNOA6UDmQNOA5kDQAOYA4QDlAOYA5QDoAOgA5QDjgOgA44DoQOhA44DjQOhA40DqAOoA40DgwOoA4MDmQNYA4IDiANYA4gDWwNbA4gDkwNbA5MDXANcA5MDkgNcA5IDYwNjA5IDhANjA4QDWQOXA20DcwOXA3MDmgOaA3MDfgOaA34DmwObA34DfQObA30DogOiA30DbwOiA28DmANuA1oDaQNuA2kDeAN4A2kDYgN4A2IDeQN5A2IDYQN5A2EDfwN/A2EDWQN/A1kDbwPwAlgDXQPwAl0D8wLzAl0DZwPzAmcD9AL1AmgDZgP1AmYDAAMAA2YDWgMAA1oD8QJtAwwDGwNtAxsDcANwAxsDEANwAxADcgNxAw8DDgNxAw4DegN6Aw4DCwN6AwsDbgMmA4IDWAMmA1gD8AIWBCoExwMWBMcDrQNABFQEKwRABCsEFQRTBPsDyANTBMgDKQSuA8kD/QOuA/0D4wPkA/wDVQTkA1UEPwSsA68DswOsA7MDsgOvA7ADtAOvA7QDswOyA7MDxQOyA8UDwQOzA7QDtgOzA7YDxQOtA7kDvQOtA70DvAO5A7oDvgO5A74DvQO8A70DtQO8A7UDsQO9A74DuAO9A7gDtQOuA8ADxAOuA8QDwwPAA8IDxgPAA8YDxAPDA8QDvwPDA78DuwPEA8YDtwPEA7cDvwPHA8oDzgPHA84DzQPKA8sDzwPKA88DzgPNA84D4APNA+AD3APOA88D0gPOA9ID4APIA9QD2APIA9gD1wPUA9YD2gPUA9oD2APXA9gD0APXA9ADzAPYA9oD0wPYA9MD0APJA9sD3wPJA98D3gPbA90D4QPbA+ED3wPeA98D2QPeA9kD1QPfA+ED0QPfA9ED2QPiA+UD6QPiA+kD6APlA+YD6gPlA+oD6QPoA+kD+QPoA/kD9QPpA+oD7APpA+wD+QPjA+8D8gPjA/ID8QPvA/AD8wPvA/MD8gPxA/ID6wPxA+sD5wPyA/MD7gPyA+4D6wPkA/QD+APkA/gD9wP0A/YD+gP0A/oD+AP3A/gD8wP3A/MD8AP4A/oD7QP4A+0D8wP7A/4DAgT7AwIEAQT+AwAEBAT+AwQEAgQBBAIEEwQBBBMEDwQCBAQEBwQCBAcEEwT8AwgECwT8AwsECgQIBAkEDAQIBAwECwQKBAsEAwQKBAME/wMLBAwEBQQLBAUEAwT9Aw0EEQT9AxEEEAQNBA4EEgQNBBIEEQQQBBEEDAQQBAwECQQRBBIEBgQRBAYEDAQUBBcEGgQUBBoEGQQXBBgEGwQXBBsEGgQZBBoEJwQZBCcEIwQaBBsEHAQaBBwEJwQVBB0EIAQVBCAEHwQdBB4EIQQdBCEEIAQfBCAEGwQfBBsEGAQgBCEEHAQgBBwEGwQWBCIEJgQWBCYEJQQiBCQEKAQiBCgEJgQlBCYEIQQlBCEEHgQmBCgEHAQmBBwEIQQpBCwEMAQpBDAELwQsBC4EMgQsBDIEMAQvBDAEPQQvBD0EOgQwBDIEMwQwBDMEPQQqBDQENwQqBDcENgQ0BDUEOAQ0BDgENwQ2BDcEMQQ2BDEELQQ3BDgEMwQ3BDMEMQQrBDkEPAQrBDwEOwQ5BDoEPQQ5BD0EPAQ7BDwEOAQ7BDgENQQ8BD0EMwQ8BDMEOAQ+BEEERQQ+BEUERARBBEIERgRBBEYERQREBEUEUgREBFIETwRFBEYESARFBEgEUgQ/BEkETAQ/BEwESwRJBEoETQRJBE0ETARLBEwERwRLBEcEQwRMBE0ESARMBEgERwRABE4EUQRABFEEUAROBE8EUgROBFIEUQRQBFEETQRQBE0ESgRRBFIESARRBEgETQRTBFYEWQRTBFkEWARWBFcEWgRWBFoEWQRYBFkEZwRYBGcEYwRZBFoEWwRZBFsEZwRUBFwEXwRUBF8EXgRcBF0EYARcBGAEXwReBF8EWgReBFoEVwRfBGAEWwRfBFsEWgRVBGEEZQRVBGUEZARhBGIEZgRhBGYEZQRkBGUEYARkBGAEXQRlBGYEWwRlBFsEYATiA6wDsgPiA7ID5QPlA7IDwQPlA8ED5gPnA8IDwAPnA8AD8QPxA8ADrgPxA64D4wOtA8cDzQOtA80DuQO5A80D3AO5A9wDugO7A90D2wO7A9sDwwPDA9sDyQPDA8kDrgPIA/sDAQTIAwEE1APUAwEEDwTUAw8E1gPVAw4EDQTVAw0E3gPeAw0E/QPeA/0DyQP8A+QD9wP8A/cDCAQIBPcD8AMIBPADCQQJBPAD7wMJBO8DEAQQBO8D4wMQBOMD/QM+BOID6AM+BOgDQQRBBOgD9QNBBPUDQgRDBPYD9ANDBPQDSwRLBPQD5ANLBOQDPwT7A1MEWAT7A1gE/gP+A1gEYwT+A2MEAAT/A2IEYQT/A2EECgQKBGEEVQQKBFUE/ANUBEAEUARUBFAEXARcBFAESgRcBEoEXQRdBEoESQRdBEkEZARkBEkEPwRkBD8EVQQUBD4ERAQUBEQEFwQXBEQETwQXBE8EGAQYBE8ETgQYBE4EHwQfBE4EQAQfBEAEFQRTBCkELwRTBC8EVgRWBC8EOgRWBDoEVwRXBDoEOQRXBDkEXgReBDkEKwReBCsEVAQqBBYEJQQqBCUENAQ0BCUEHgQ0BB4ENQQ1BB4EHQQ1BB0EOwQ7BB0EFQQ7BBUEKwSsAxQEGQSsAxkErwOvAxkEIwSvAyMEsAOxAyQEIgSxAyIEvAO8AyIEFgS8AxYErQMpBMgD1wMpBNcDLAQsBNcDzAMsBMwDLgQtBMsDygMtBMoDNgQ2BMoDxwM2BMcDKgTiAz4EFATiAxQErAPSBOYEgwTSBIMEaQT8BBAF5wT8BOcE0QQPBbcEhAQPBYQE5QRqBIUEuQRqBLkEnwSgBLgEEQWgBBEF+wRoBGsEbwRoBG8EbgRrBGwEcARrBHAEbwRuBG8EgQRuBIEEfQRvBHAEcgRvBHIEgQRpBHUEeQRpBHkEeAR1BHYEegR1BHoEeQR4BHkEcQR4BHEEbQR5BHoEdAR5BHQEcQRqBHwEgARqBIAEfwR8BH4EggR8BIIEgAR/BIAEewR/BHsEdwSABIIEcwSABHMEewSDBIYEigSDBIoEiQSGBIcEiwSGBIsEigSJBIoEnASJBJwEmASKBIsEjgSKBI4EnASEBJAElASEBJQEkwSQBJIElgSQBJYElASTBJQEjASTBIwEiASUBJYEjwSUBI8EjASFBJcEmwSFBJsEmgSXBJkEnQSXBJ0EmwSaBJsElQSaBJUEkQSbBJ0EjQSbBI0ElQSeBKEEpQSeBKUEpAShBKIEpgShBKYEpQSkBKUEtQSkBLUEsQSlBKYEqASlBKgEtQSfBKsErgSfBK4ErQSrBKwErwSrBK8ErgStBK4EpwStBKcEowSuBK8EqgSuBKoEpwSgBLAEtASgBLQEswSwBLIEtgSwBLYEtASzBLQErwSzBK8ErAS0BLYEqQS0BKkErwS3BLoEvgS3BL4EvQS6BLwEwAS6BMAEvgS9BL4EzwS9BM8EywS+BMAEwwS+BMMEzwS4BMQExwS4BMcExgTEBMUEyATEBMgExwTGBMcEvwTGBL8EuwTHBMgEwQTHBMEEvwS5BMkEzQS5BM0EzATJBMoEzgTJBM4EzQTMBM0EyATMBMgExQTNBM4EwgTNBMIEyATQBNME1gTQBNYE1QTTBNQE1wTTBNcE1gTVBNYE4wTVBOME3wTWBNcE2ATWBNgE4wTRBNkE3ATRBNwE2wTZBNoE3QTZBN0E3ATbBNwE1wTbBNcE1ATcBN0E2ATcBNgE1wTSBN4E4gTSBOIE4QTeBOAE5ATeBOQE4gThBOIE3QThBN0E2gTiBOQE2ATiBNgE3QTlBOgE7ATlBOwE6wToBOoE7gToBO4E7ATrBOwE+QTrBPkE9gTsBO4E7wTsBO8E+QTmBPAE8wTmBPME8gTwBPEE9ATwBPQE8wTyBPME7QTyBO0E6QTzBPQE7wTzBO8E7QTnBPUE+ATnBPgE9wT1BPYE+QT1BPkE+AT3BPgE9AT3BPQE8QT4BPkE7wT4BO8E9AT6BP0EAQX6BAEFAAX9BP4EAgX9BAIFAQUABQEFDgUABQ4FCwUBBQIFBAUBBQQFDgX7BAUFCAX7BAgFBwUFBQYFCQUFBQkFCAUHBQgFAwUHBQMF/wQIBQkFBAUIBQQFAwX8BAoFDQX8BA0FDAUKBQsFDgUKBQ4FDQUMBQ0FCQUMBQkFBgUNBQ4FBAUNBQQFCQUPBRIFFQUPBRUFFAUSBRMFFgUSBRYFFQUUBRUFIwUUBSMFHwUVBRYFFwUVBRcFIwUQBRgFGwUQBRsFGgUYBRkFHAUYBRwFGwUaBRsFFgUaBRYFEwUbBRwFFwUbBRcFFgURBR0FIQURBSEFIAUdBR4FIgUdBSIFIQUgBSEFHAUgBRwFGQUhBSIFFwUhBRcFHAWeBGgEbgSeBG4EoQShBG4EfQShBH0EogSjBH4EfASjBHwErQStBHwEagStBGoEnwRpBIMEiQRpBIkEdQR1BIkEmAR1BJgEdgR3BJkElwR3BJcEfwR/BJcEhQR/BIUEagSEBLcEvQSEBL0EkASQBL0EywSQBMsEkgSRBMoEyQSRBMkEmgSaBMkEuQSaBLkEhQS4BKAEswS4BLMExATEBLMErATEBKwExQTFBKwEqwTFBKsEzATMBKsEnwTMBJ8EuQT6BJ4EpAT6BKQE/QT9BKQEsQT9BLEE/gT/BLIEsAT/BLAEBwUHBbAEoAQHBaAE+wS3BA8FFAW3BBQFugS6BBQFHwW6BB8FvAS7BB4FHQW7BB0FxgTGBB0FEQXGBBEFuAQQBfwEDAUQBQwFGAUYBQwFBgUYBQYFGQUZBQYFBQUZBQUFIAUgBQUF+wQgBfsEEQXQBPoEAAXQBAAF0wTTBAAFCwXTBAsF1ATUBAsFCgXUBAoF2wTbBAoF/ATbBPwE0QQPBeUE6wQPBesEEgUSBesE9gQSBfYEEwUTBfYE9QQTBfUEGgUaBfUE5wQaBecEEAXmBNIE4QTmBOEE8ATwBOEE2gTwBNoE8QTxBNoE2QTxBNkE9wT3BNkE0QT3BNEE5wRoBNAE1QRoBNUEawRrBNUE3wRrBN8EbARtBOAE3gRtBN4EeAR4BN4E0gR4BNIEaQTlBIQEkwTlBJME6AToBJMEiAToBIgE6gTpBIcEhgTpBIYE8gTyBIYEgwTyBIME5gSeBPoE0ASeBNAEaASOBaIFPwWOBT8FJQW4BcwFowW4BaMFjQXLBXMFQAXLBUAFoQUmBUEFdQUmBXUFWwVcBXQFzQVcBc0FtwUkBScFKwUkBSsFKgUnBSgFLAUnBSwFKwUqBSsFPQUqBT0FOQUrBSwFLgUrBS4FPQUlBTEFNQUlBTUFNAUxBTIFNgUxBTYFNQU0BTUFLQU0BS0FKQU1BTYFMAU1BTAFLQUmBTgFPAUmBTwFOwU4BToFPgU4BT4FPAU7BTwFNwU7BTcFMwU8BT4FLwU8BS8FNwU/BUIFRgU/BUYFRQVCBUMFRwVCBUcFRgVFBUYFWAVFBVgFVAVGBUcFSgVGBUoFWAVABUwFUAVABVAFTwVMBU4FUgVMBVIFUAVPBVAFSAVPBUgFRAVQBVIFSwVQBUsFSAVBBVMFVwVBBVcFVgVTBVUFWQVTBVkFVwVWBVcFUQVWBVEFTQVXBVkFSQVXBUkFUQVaBV0FYQVaBWEFYAVdBV4FYgVdBWIFYQVgBWEFcQVgBXEFbQVhBWIFZAVhBWQFcQVbBWcFagVbBWoFaQVnBWgFawVnBWsFagVpBWoFYwVpBWMFXwVqBWsFZgVqBWYFYwVcBWwFcAVcBXAFbwVsBW4FcgVsBXIFcAVvBXAFawVvBWsFaAVwBXIFZQVwBWUFawVzBXYFegVzBXoFeQV2BXgFfAV2BXwFegV5BXoFiwV5BYsFhwV6BXwFfwV6BX8FiwV0BYAFgwV0BYMFggWABYEFhAWABYQFgwWCBYMFewWCBXsFdwWDBYQFfQWDBX0FewV1BYUFiQV1BYkFiAWFBYYFigWFBYoFiQWIBYkFhAWIBYQFgQWJBYoFfgWJBX4FhAWMBY8FkgWMBZIFkQWPBZAFkwWPBZMFkgWRBZIFnwWRBZ8FmwWSBZMFlAWSBZQFnwWNBZUFmAWNBZgFlwWVBZYFmQWVBZkFmAWXBZgFkwWXBZMFkAWYBZkFlAWYBZQFkwWOBZoFngWOBZ4FnQWaBZwFoAWaBaAFngWdBZ4FmQWdBZkFlgWeBaAFlAWeBZQFmQWhBaQFqAWhBagFpwWkBaYFqgWkBaoFqAWnBagFtQWnBbUFsgWoBaoFqwWoBasFtQWiBawFrwWiBa8FrgWsBa0FsAWsBbAFrwWuBa8FqQWuBakFpQWvBbAFqwWvBasFqQWjBbEFtAWjBbQFswWxBbIFtQWxBbUFtAWzBbQFsAWzBbAFrQW0BbUFqwW0BasFsAW2BbkFvQW2Bb0FvAW5BboFvgW5Bb4FvQW8Bb0FygW8BcoFxwW9Bb4FwAW9BcAFygW3BcEFxAW3BcQFwwXBBcIFxQXBBcUFxAXDBcQFvwXDBb8FuwXEBcUFwAXEBcAFvwW4BcYFyQW4BckFyAXGBccFygXGBcoFyQXIBckFxQXIBcUFwgXJBcoFwAXJBcAFxQXLBc4F0QXLBdEF0AXOBc8F0gXOBdIF0QXQBdEF3wXQBd8F2wXRBdIF0wXRBdMF3wXMBdQF1wXMBdcF1gXUBdUF2AXUBdgF1wXWBdcF0gXWBdIFzwXXBdgF0wXXBdMF0gXNBdkF3QXNBd0F3AXZBdoF3gXZBd4F3QXcBd0F2AXcBdgF1QXdBd4F0wXdBdMF2AVaBSQFKgVaBSoFXQVdBSoFOQVdBTkFXgVfBToFOAVfBTgFaQVpBTgFJgVpBSYFWwUlBT8FRQUlBUUFMQUxBUUFVAUxBVQFMgUzBVUFUwUzBVMFOwU7BVMFQQU7BUEFJgVABXMFeQVABXkFTAVMBXkFhwVMBYcFTgVNBYYFhQVNBYUFVgVWBYUFdQVWBXUFQQV0BVwFbwV0BW8FgAWABW8FaAWABWgFgQWBBWgFZwWBBWcFiAWIBWcFWwWIBVsFdQW2BVoFYAW2BWAFuQW5BWAFbQW5BW0FugW7BW4FbAW7BWwFwwXDBWwFXAXDBVwFtwVzBcsF0AVzBdAFdgV2BdAF2wV2BdsFeAV3BdoF2QV3BdkFggWCBdkFzQWCBc0FdAXMBbgFyAXMBcgF1AXUBcgFwgXUBcIF1QXVBcIFwQXVBcEF3AXcBcEFtwXcBbcFzQWMBbYFvAWMBbwFjwWPBbwFxwWPBccFkAWQBccFxgWQBcYFlwWXBcYFuAWXBbgFjQXLBaEFpwXLBacFzgXOBacFsgXOBbIFzwXPBbIFsQXPBbEF1gXWBbEFowXWBaMFzAWiBY4FnQWiBZ0FrAWsBZ0FlgWsBZYFrQWtBZYFlQWtBZUFswWzBZUFjQWzBY0FowUkBYwFkQUkBZEFJwUnBZEFmwUnBZsFKAUpBZwFmgUpBZoFNAU0BZoFjgU0BY4FJQWhBUAFTwWhBU8FpAWkBU8FRAWkBUQFpgWlBUMFQgWlBUIFrgWuBUIFPwWuBT8FogVaBbYFjAVaBYwFJAWJUE5HDQoaCgAAAA1JSERSAAAAQAAAAEAIAgAAACUL5okAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQflARUSIQUzrTj+AAAAb0lEQVRo3u3SsQmAMBRF0SiW1u4hxDHjFBa29nYOkCl0Agdwhl+ICOfULx8upDm3IUWMuQ/t03KE5rXsoX2bfk6AAAECBAgQIECAgO90aY09mPMd2l8ldn+sky8kQIAAAQIECBAgQAAAAAAAAMA7Ho6SCuSDErG8AAAAAElFTkSuQmCCAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAIBRtgBAAbgAgFE2gJaQukCF6zoAQAE4AMLVugz5kDwAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAABGtwAA5rcAAEY3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AACKtwAAircAAIo3AACKtwAAircAAIo3gC4Qu2DS3jsAkFG5AGabujC5PzwAwJU5AKCzuICTWzwA1M86AACAsgAAgLMAAAA0AAAKNgAACjYAAKC2AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1ANjeukRZhjwAqFG5AEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3QMWPOkA73zoAIJG4AIBRtgBAATgAgFE2AA0BOyQGkTwALMu4AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQCgszgA4O+4AC0QO7DS3jsAANI4AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAQK+4AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3ABADOwwrhzwA0NE4AEisOtCTRDwA0KS5ANCkOWjgWTwAmtO6AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AMLVugz5kDwARNi4gJaQukCF6zoAQAG4AAB8tgAAGbcAAIK1AABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AACKtwAAircAAIq3ANjeukRZhjwAqFE5ACb3uhB4TjwA0KQ5AAAZtwAAfLYAAIK1AAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3gC4Qu2DS3jsAkFE5AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2QMWPOkA73zoAIJE4AA0BOyQGkTwALMs4AACAsgAAADQAAICzAAD7NQDg77gAoLO4AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgBAsjgAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AACKtwAAijcAAIq3AACKtwAAijcAQK84AC0QO7DS3jsAANK4AAQEO2hoTjwAwJW5AACAsgAAgDMAAAC0AAAetgAAHjYAALi2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1ABADOwwrhzwA0NG4AAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AMLVOgz5kDwARNg4gJaQOkCF6zoAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AAAKtgAAoDYAAAq2AAC0twAAtDcAADW3AICNtwCAjTcAAI63ANjeOkRZhjwAqFG5AAD4Ooh0TjwAaKG5AAAZNwAAfLYAAII1AEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3gC4QO2DS3jsAkFG5AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2QMWPukA73zoAIJG4AA0BuyQGkTwALMu4ALDPuAAAGTcAAHw2AAD7tQDg77gAoLM4AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwBgrjgAAI63AC0Qu7DS3jsAANI4AJcDu4DITDwAKJk5AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twAQuzgAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1ABADuwwrhzwA0NE4AACgtgAACrYAAAq2AABQNQAAUDUA8NC4AIBRNgBAAbgAgFG2gJaQOkCF6zoAQAG4AMLVOgz5kDwAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AICNtwCAjTcAAI43gC4QO2DS3jsAkFE5AAD4Ooh0TjwAaKE5AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AAAEtwAABDcAAIo1ANjeOkRZhjwAqFE5AADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AA0BuyQGkTwALMs4QMWPukA73zoAIJE4AACAMwAAADQAAICyAAAEtwAABLcAAIo1ALDPuAAAGTcAAHy2AADZtgBAsjgAANk2AABQNQAAUDUA8NA4AICNtwBgrjgAAI43ABADuwwrhzwA0NG4AAQEu2hoTjwAwJW5AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twAQuzgAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQCgszgA4O84AO8Pu9CT2zsAUFu5AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwCAjTcAAI63AACONwCAjTcAgI23AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAACgNgAACjYAAAq2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAC4tgAAHjYAAB42AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACONwCAjTcAgI03AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACKtwAAijcAAIq3AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACAMgAAALQAAIAzAADZtgAAfDcAANm2AABQNQAAULUAANA0AACKNwAAircAAIo3AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AAAKtgAACjYAAKC2AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAECsNwBASDgAQKw3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AAB8NgAAgjUAABk3AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAC4NgAAHjYAAB42AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AABxtwAA+zUAAHE3AACAMgAAgLMAAAC0AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAACgtgAACjYAAAo2AABQNQAAULUAANC0AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACCNQAAGTcAAHy2AECsNwBASDgAQKy3AAC0twAAtLcAADU3AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AACKtwAAijcAAIo3AICNNwAAjrcAgI23AICNNwCAjbcAAI63AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAECstwBASDgAQKw3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAADmtwAARjcAAEa3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACAMgAAALQAAIAzAABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACKNwAAircAAIo3AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AABGNwAA5jcAAEY3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACKNwAAijcAAIo3AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AECsNwBASLgAQKy3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACKNwAAijcAAIq3AAAANAAAgDIAAICzAAAEtwAAirUAAAQ3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AAAeNgAAHjYAALi2AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AADZNgAA2bYAAHw3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AMBQOADAULgAwFA4AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAACgtgAACjYAAAq2AIC0twCANTcAgLS3AACAMgAAgLMAAAA0AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AMBQOADAUDgAwFA4AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AAB8NgAAgrUAABm3AAAEtwAAijUAAAQ3AACAMgAAgLMAAAC0AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AMBQOADAUDgAwFC4AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AAB8tgAAgrUAABk3AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAACgNgAACjYAAAo2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AECsNwBASLgAQKw3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AADZtgAA2TYAAHy3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAEBIOABArDcAQKw3AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AABGtwAA5jcAAEY3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AAB8NgAAGTcAAIK1AAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AABGNwAA5jcAAEa3AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAAAetgAAuLYAAB42AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAZtwAAgjUAAHw2AABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAADmtwAARrcAAEa3AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AAAKNgAACjYAAKA2AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AAB8NgAAGbcAAII1AABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AABGNwAA5rcAAEa3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAZNwAAfDYAAIK1AACgtgAACrYAAAo2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAABGtwAA5rcAAEY3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AACKtwAAircAAIo3AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AAAKNgAACjYAAKC2AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AAB8tgAAGbcAAIK1AABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AACKtwAAircAAIq3AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAZtwAAfLYAAIK1AAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AACKtwAAijcAAIq3AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAetgAAHjYAALi2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AAAKtgAAoDYAAAq2AAC0twAAtDcAADW3AICNtwCAjTcAAI63AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAZNwAAfLYAAII1AEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AABQNQAAUDUAANA0AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AICNtwCAjTcAAI43AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AAAEtwAABDcAAIo1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AADZtgAAfLcAANk2AABQNQAAUDUAANC0AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2gJaQukCF6zoAQAE4AMLVugz5kDwAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwCAjTcAAI63AACONwCAjTcAgI23gC4Qu2DS3jsAkFG5AGabujC5PzwAwJU5AKCzuICTWzwA1M86AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1ANjeukRZhjwAqFG5AACgNgAACjYAAAq2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3QMWPOkA73zoAIJG4AIBRtgBAATgAgFE2AA0BOyQGkTwALMu4ALDPOAAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQCgszgA4O+4AC0QO7DS3jsAANI4AADZNgAA2bYAQLI4AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23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AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AACKtwAAijcAAIo3AICNNwAAjrcAgI23AICNNwCAjbcAAI63AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAECstwBASDgAQKw3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAADmtwAARjcAAEa3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACAMgAAALQAAIAzAABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACKNwAAircAAIo3AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AABGNwAA5jcAAEY3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACKNwAAijcAAIo3AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AECsNwBASLgAQKy3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACKNwAAijcAAIq3AAAANAAAgDIAAICzAAAEtwAAirUAAAQ3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AAAeNgAAHjYAALi2AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AADZNgAA2bYAAHw3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AMBQOADAULgAwFA4AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAACgtgAACjYAAAq2AIC0twCANTcAgLS3AACAMgAAgLMAAAA0AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AMBQOADAUDgAwFA4AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AAB8NgAAgrUAABm3AAAEtwAAijUAAAQ3AACAMgAAgLMAAAC0AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AMBQOADAUDgAwFC4AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AAB8tgAAgrUAABk3AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAACgNgAACjYAAAo2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AECsNwBASLgAQKw3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AADZtgAA2TYAAHy3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAEBIOABArDcAQKw3AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AABGtwAA5jcAAEY3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AAB8NgAAGTcAAIK1AAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AABGNwAA5jcAAEa3AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAAAetgAAuLYAAB42AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAZtwAAgjUAAHw2AABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAADmtwAARrcAAEa3AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AAAKNgAACjYAAKA2AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AAB8NgAAGbcAAII1AABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AABGNwAA5rcAAEa3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAZNwAAfDYAAIK1AACgtgAACrYAAAo2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAABGtwAA5rcAAEY3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AACKtwAAircAAIo3AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AAAKNgAACjYAAKC2AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AAB8tgAAGbcAAIK1AABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AACKtwAAircAAIq3AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAZtwAAfLYAAIK1AAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AACKtwAAijcAAIq3AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAetgAAHjYAALi2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AAAKtgAAoDYAAAq2AAC0twAAtDcAADW3AICNtwCAjTcAAI63AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAZNwAAfLYAAII1AEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AABQNQAAUDUAANA0AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AICNtwCAjTcAAI43AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AAAEtwAABDcAAIo1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AADZtgAAfLcAANk2AABQNQAAUDUAANC0AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwCAjTcAAI63AACONwCAjTcAgI23AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAACgNgAACjYAAAq2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAC4tgAAHjYAAB42AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACONwCAjTcAgI03AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACKtwAAijcAAIq3AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2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AAD4uoh0TjwAaKE5AAAAtAAAgLMAAICyAAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3gC4Qu2DS3jsAkFE5AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2QMWPOkA73zoAIJE4AA0BOyQGkTwALMs4AACAsgAAADQAAICzAAD7NQDg77gAoLO4AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AICNNwAAjrcAgI03AACKtwAAijcAQK84AICNNwCAjbcAAI43AC0QO7DS3jsAANK4AAQEO2hoTjwAwJW5ALDPOAAAfDYAABm3AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1ABADOwwrhzwA0NG4AADmtwAARjcAAEa3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AMLVOgz5kDwAgFE2gJaQOkCF6zoAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACAMgAAALQAAIAzAABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACKNwAAircAAIo3ANjeOkRZhjwAqFG5AAD4Ooh0TjwAaKG5AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3gC4QO2DS3jsAkFG5AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2QMWPukA73zoAIJG4AA0BuyQGkTwALMu4ALDPuAAAGTcAAHw2AAD7tQDg77gAoLM4AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AABGNwAA5jcAAEY3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACKNwAAijcAAIo3AC0Qu7DS3jsAANI4AJcDu4DITDwAKJk5ALDPuAAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1ABADuwwrhzwA0NE4AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2gJaQOkCF6zoAQAG4AMLVOgz5kDwAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AECsNwBASLgAQKy3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3gC4QO2DS3jsAkFE5AAD4Ooh0TjwAaKE5AACCNQAAfLYAABm3AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1ANjeOkRZhjwAqFE5AAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AA0BuyQGkTwALMs4QMWPukA73zoAIJE4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgBAsjgAANk2AAC0twAAtLcAADU3AACKNwAAijcAAIq3ABADuwwrhzwA0NG4AJcDu4DITDwAKJm5AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3ALDPuAAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQCgszgA4O84AO8Pu9CT2zsAUFu5AAAeNgAAHjYAALi2AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AADZNgAA2bYAAHw3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AMBQOADAULgAwFA4AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAACgtgAACjYAAAq2AIC0twCANTcAgLS3AACAMgAAgLMAAAA0AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AMBQOADAUDgAwFA4AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AAB8NgAAgrUAABm3AAAEtwAAijUAAAQ3AACAMgAAgLMAAAC0AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AMBQOADAUDgAwFC4AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AAB8tgAAgrUAABk3AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAACgNgAACjYAAAo2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AECsNwBASLgAQKw3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AADZtgAA2TYAAHy3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAEBIOABArDcAQKw3AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AABGtwAA5jcAAEY3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AAB8NgAAGTcAAIK1AAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AABGNwAA5jcAAEa3AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAAAetgAAuLYAAB42AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAZtwAAgjUAAHw2AABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAADmtwAARrcAAEa3AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AAAKNgAACjYAAKA2AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AAB8NgAAGbcAAII1AABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AABGNwAA5rcAAEa3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAZNwAAfDYAAIK1AACgtgAACrYAAAo2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvf//fz8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvf//fz8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvf//fz8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvf//fz8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAzMxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAABGtwAA5rcAAEY3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AACKtwAAircAAIo3AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AAAKNgAACjYAAKC2AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AAB8tgAAGbcAAIK1AABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AACKtwAAircAAIq3AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAZtwAAfLYAAIK1AAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AACKtwAAijcAAIq3AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAetgAAHjYAALi2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AAAKtgAAoDYAAAq2AAC0twAAtDcAADW3AICNtwCAjTcAAI63AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAZNwAAfLYAAII1AEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AABQNQAAUDUAANA0AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AICNtwCAjTcAAI43AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AAAEtwAABDcAAIo1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AADZtgAAfLcAANk2AABQNQAAUDUAANC0AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwCAjTcAAI63AACONwCAjTcAgI23AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAACgNgAACjYAAAq2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAC4tgAAHjYAAB42AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACONwCAjTcAgI03AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACKtwAAijcAAIq3AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACAMgAAALQAAIAzAADZtgAAfDcAANm2AABQNQAAULUAANA0AACKNwAAircAAIo3AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AAAKtgAACjYAAKC2AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAECsNwBASDgAQKw3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AAB8NgAAgjUAABk3AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAC4NgAAHjYAAB42AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AABxtwAA+zUAAHE3AACAMgAAgLMAAAC0AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAACgtgAACjYAAAo2AABQNQAAULUAANC0AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACCNQAAGTcAAHy2AECsNwBASDgAQKy3AAC0twAAtLcAADU3AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AACKtwAAijcAAIo3AICNNwAAjrcAgI23AICNNwCAjbcAAI63AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAECstwBASDgAQKw3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAADmtwAARjcAAEa3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACAMgAAALQAAIAzAABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACKNwAAircAAIo3AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AABGNwAA5jcAAEY3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACKNwAAijcAAIo3AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AECsNwBASLgAQKy3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACKNwAAijcAAIq3AAAANAAAgDIAAICzAAAEtwAAirUAAAQ3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AAAeNgAAHjYAALi2AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2gJaQukCF6zoAQAE4AMLVugz5kDwAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwAAjjcAgI23AACKtwAAircAAIo3gC4Qu2DS3jsAkFG5AGabujC5PzwAwJU5AKCzuICTWzwA1M86AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1ANjeukRZhjwAqFG5AAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3QMWPOkA73zoAIJG4AIBRtgBAATgAgFE2AA0BOyQGkTwALMu4AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQCgszgA4O+4AC0QO7DS3jsA4FE5AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3ABADOwwrhzwA0NE4AEisOtCTRDwA0KS5ANCkOWjgWTwAmtO6AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AMLVugz5kDwAgFG2gJaQukCF6zoAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03ANjeukRZhjwAqFE5ACb3uhB4TjwA0KQ5AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3gC4Qu2DS3jsAkFE5AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2QMWPOkA73zoAIJE4AA0BOyQGkTwALMs4AACAsgAAADQAAICzAAD7NQDg77gAoLO4AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwAAjrcAgI03AACONwCAjbcAgI03AC0QO7DS3jsAANK4AJcDO4DITDwAKJm5AACAsgAAgDMAAAC0AADZNgAA2bYAAHw3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1ABADOwwrhzwA0NG4AACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AMLVOgz5kDwAgFE2gJaQOkCF6zoAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AMBQOADAULgAwFA4ANjeOkRZhjwAqFG5AAD4Ooh0TjwAaKG5AAAANAAAgLMAAIAyAACgtgAACjYAAAq2AIC0twCANTcAgLS3AACAMgAAgLMAAAA0AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3gGwQO0AR4jsAIEi5AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2QMWPukA73zoAIJG4AA0BuyQGkTwALMu4ALDPuAAAGTcAAHw2AAD7tQDg77gAoLM4AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AMBSuADAUDgAwFA4AC0Qu7DS3jsAANI4AJcDu4DITDwAKJk5AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AAAEtwAABLcAAIq1ABADuwwrhzwA0NE4AACgtgAACrYAAAq2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2gJaQOkCF6zoAQAG4AMLVOgz5kDwAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3gGwQO0AR4jsAIEg5AAD4Ooh0TjwAaKE5AACAMgAAgLMAAAC0AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1ANjeOkRZhjwAqFE5AAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AA0BuyQGkTwALMs4QMWPukA73zoAIJE4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgBAsjgAANk2AAC0twAAtLcAADU3AMBSuADAUDgAwFC4ABADuwwrhzwA0NG4AAQEu2hoTjwAwJW5AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3ALDPuAAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQCgszgA4O84AO8Pu9CT2zsAUFu5AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AAB8tgAAgrUAABk3AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAACgNgAACjYAAAo2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AECsNwBASLgAQKw3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AADZtgAA2TYAAHy3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAEBIOABArDcAQKw3AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AABGtwAA5jcAAEY3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AAB8NgAAGTcAAIK1AAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AABGNwAA5jcAAEa3AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAAAetgAAuLYAAB42AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAZtwAAgjUAAHw2AABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAADmtwAARrcAAEa3AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AAAKNgAACjYAAKA2AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AAB8NgAAGbcAAII1AABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AABGNwAA5rcAAEa3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAZNwAAfDYAAIK1AACgtgAACrYAAAo2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPf//fz8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPf//fz8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPf//fz8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPf//fz8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAzMxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAABGtwAA5rcAAEY3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AACKtwAAircAAIo3AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AAAKNgAACjYAAKC2AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AAB8tgAAGbcAAIK1AABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AACKtwAAircAAIq3AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAZtwAAfLYAAIK1AAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AACKtwAAijcAAIq3AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAetgAAHjYAALi2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AAAKtgAAoDYAAAq2AAC0twAAtDcAADW3AICNtwCAjTcAAI63AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAZNwAAfLYAAII1AEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AABQNQAAUDUAANA0AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AICNtwCAjTcAAI43AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AAAEtwAABDcAAIo1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AADZtgAAfLcAANk2AABQNQAAUDUAANC0AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwCAjTcAAI63AACONwCAjTcAgI23AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAACgNgAACjYAAAq2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAC4tgAAHjYAAB42AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACONwCAjTcAgI03AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACKtwAAijcAAIq3AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACAMgAAALQAAIAzAADZtgAAfDcAANm2AABQNQAAULUAANA0AACKNwAAircAAIo3AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AAAKtgAACjYAAKC2AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAECsNwBASDgAQKw3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AAB8NgAAgjUAABk3AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAC4NgAAHjYAAB42AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AABxtwAA+zUAAHE3AACAMgAAgLMAAAC0AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAACgtgAACjYAAAo2AABQNQAAULUAANC0AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACCNQAAGTcAAHy2AECsNwBASDgAQKy3AAC0twAAtLcAADU3AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AACKtwAAijcAAIo3AICNNwAAjrcAgI23AICNNwCAjbcAAI63AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAECstwBASDgAQKw3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAADmtwAARjcAAEa3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACAMgAAALQAAIAzAABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACKNwAAircAAIo3AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AABGNwAA5jcAAEY3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACKNwAAijcAAIo3AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AECsNwBASLgAQKy3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACKNwAAijcAAIq3AAAANAAAgDIAAICzAAAEtwAAirUAAAQ3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AAAeNgAAHjYAALi2AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AADZNgAA2bYAAHw3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AMBQOADAULgAwFA4AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAACgtgAACjYAAAq2AIC0twCANTcAgLS3AACAMgAAgLMAAAA0AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AMBQOADAUDgAwFA4AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AAB8NgAAgrUAABm3AAAEtwAAijUAAAQ3AACAMgAAgLMAAAC0AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AMBQOADAUDgAwFC4AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2gJaQukCF6zoAQAE4AMLVugz5kDwAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3gGwQu0AR4jsAIEi5AGabujC5PzwAwJU5AKCzuICTWzwA1M86AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1ANjeukRZhjwAqFG5AAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3QMWPOkA73zoAIJG4AIBRtgBAATgAgFE2AA0BOyQGkTwALMu4ALDPOAAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQCgszgA4O+4AO8PO9CT2zsAUFs5AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgBAsjgAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3ABADOwwrhzwA0NE4AEisOtCTRDwA0KS5ANCkOWjgWTwAmtO6AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AMLVugz5kDwAgFG2gJaQukCF6zoAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03ANjeukRZhjwAqFE5AAD4uoh0TjwAaKE5AAAAtAAAgLMAAICyAACgNgAACjYAAAo2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3gGwQu0AR4jsAIEg5AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2QMWPOkA73zoAIJE4AA0BOyQGkTwALMs4ALDPOAAAGTcAAHy2AAD7NQDg77gAoLO4AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACONwCAjbcAgI03AC0QO7DS3jsAANK4AJcDO4DITDwAKJm5AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1ABADOwwrhzwA0NG4AACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AMLVOgz5kDwAgFE2gJaQOkCF6zoAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AECsNwBASLgAQKw3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAbgOvwohzwAyE25ACb3OhB4TjwA0KS5AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3gGwQO0AR4jsAIEi5AADZtgAA2TYAAHy3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2QMWPukA73zoAIJG4AA0BuyQGkTwALMu4AACAMgAAADQAAIAzAAD7tQDg77gAoLM4AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AC0Qu7DS3jsAANI4AAQEu2hoTjwAwJU5AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1ABADuwwrhzwA0NE4AEBIOABArDcAQKw3AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2gJaQOkCF6zoAQAG4AMLVOgz5kDwAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03gC4QO2DS3jsAkFE5AAD4Ooh0TjwAaKE5AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1ANjeOkRZhjwAqFE5AAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AA0BuyQGkTwALMs4QMWPukA73zoAIJE4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03ABADuwwrhzwA0NG4AAQEu2hoTjwAwJW5AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQCgszgA4O84AC0Qu7DS3jsA4FG5AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AABGtwAA5jcAAEY3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AAB8NgAAGTcAAIK1AAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AABGNwAA5jcAAEa3AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAAAetgAAuLYAAB42AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAZtwAAgjUAAHw2AABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAADmtwAARrcAAEa3AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AAAKNgAACjYAAKA2AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AAB8NgAAGbcAAII1AABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AABGNwAA5rcAAEa3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAZNwAAfDYAAIK1AACgtgAACrYAAAo2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPf//fz8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACA0MxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvf//fz8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACA0MxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAABGtwAA5rcAAEY3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AACKtwAAircAAIo3AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AAAKNgAACjYAAKC2AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AAB8tgAAGbcAAIK1AABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AACKtwAAircAAIq3AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAZtwAAfLYAAIK1AAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AACKtwAAijcAAIq3AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAetgAAHjYAALi2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AAAKtgAAoDYAAAq2AAC0twAAtDcAADW3AICNtwCAjTcAAI63AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAZNwAAfLYAAII1AEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AABQNQAAUDUAANA0AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AICNtwCAjTcAAI43AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AAAEtwAABDcAAIo1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AADZtgAAfLcAANk2AABQNQAAUDUAANC0AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwCAjTcAAI63AACONwCAjTcAgI23AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAACgNgAACjYAAAq2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAC4tgAAHjYAAB42AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACONwCAjTcAgI03AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACKtwAAijcAAIq3AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACAMgAAALQAAIAzAADZtgAAfDcAANm2AABQNQAAULUAANA0AACKNwAAircAAIo3AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AAAKtgAACjYAAKC2AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAECsNwBASDgAQKw3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AAB8NgAAgjUAABk3AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAC4NgAAHjYAAB42AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AABxtwAA+zUAAHE3AACAMgAAgLMAAAC0AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAACgtgAACjYAAAo2AABQNQAAULUAANC0AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACCNQAAGTcAAHy2AECsNwBASDgAQKy3AAC0twAAtLcAADU3AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AACKtwAAijcAAIo3AICNNwAAjrcAgI23AICNNwCAjbcAAI63AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAECstwBASDgAQKw3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAADmtwAARjcAAEa3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACAMgAAALQAAIAzAABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACKNwAAircAAIo3AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AABGNwAA5jcAAEY3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACKNwAAijcAAIo3AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AECsNwBASLgAQKy3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACKNwAAijcAAIq3AAAANAAAgDIAAICzAAAEtwAAirUAAAQ3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AAAeNgAAHjYAALi2AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AADZNgAA2bYAAHw3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AMBQOADAULgAwFA4AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAACgtgAACjYAAAq2AIC0twCANTcAgLS3AACAMgAAgLMAAAA0AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AMBQOADAUDgAwFA4AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AAB8NgAAgrUAABm3AAAEtwAAijUAAAQ3AACAMgAAgLMAAAC0AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AMBQOADAUDgAwFC4AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AAB8tgAAgrUAABk3AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAACgNgAACjYAAAo2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AECsNwBASLgAQKw3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AADZtgAA2TYAAHy3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAEBIOABArDcAQKw3AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2gJaQukCF6zoAQAE4AMLVugz5kDwAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwAAjjcAgI23AACKtwAAircAAIo3gC4Qu2DS3jsAkFG5AGabujC5PzwAwJU5AKCzuICTWzwA1M86AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1ANjeukRZhjwAqFG5AAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3QMWPOkA73zoAIJG4AIBRtgBAATgAgFE2AA0BOyQGkTwALMu4AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQCgszgA4O+4AO8PO9CT2zsAUFs5AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AECvOAAAijcAAIo3AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1ALDPOAAAGTcAAHw2AABGtwAA5jcAAEY3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3ABADOwwrhzwA0NE4AEisOtCTRDwA0KS5ANCkOWjgWTwAmtO6AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AMLVugz5kDwAgFG2gJaQukCF6zoAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACKtwAAircAAIq3AICNNwAAjjcAgI03ANjeukRZhjwAqFE5ACb3uhB4TjwA0KQ5AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3gC4Qu2DS3jsAkFE5AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2QMWPOkA73zoAIJE4AA0BOyQGkTwALMs4ALDPOAAAGTcAAHy2AAD7NQDg77gAoLO4AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AECvOAAAijcAAIq3AC0QO7DS3jsAANK4AAQEO2hoTjwAwJW5AACAsgAAgDMAAAC0AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1ABADOwwrhzwA0NG4AEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AMLVOgz5kDwAgFE2gJaQOkCF6zoAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23ANjeOkRZhjwAqFG5ACb3OhB4TjwA0KS5AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3gC4QO2DS3jsAkFG5AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2QMWPukA73zoAIJG4AA0BuyQGkTwALMu4ALDPuAAAGTcAAHw2AAD7tQDg77gAoLM4AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AC0Qu7DS3jsAANI4AAQEu2hoTjwAwJU5ALDPuAAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1ANb3ulRbhjwAkNk4AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2gJaQOkCF6zoAQAG4AMLVOgz5kDwAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03gC4QO2DS3jsAkFE5AAD4Ooh0TjwAaKE5AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1ANjeOkRZhjwAqFE5AAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AA0BuyQGkTwALMs4QMWPukA73zoAIJE4AAB8NgAAGTcAAIK1AAAEtwAABLcAAIo1ALDPuAAAGTcAAHy2AABGNwAA5jcAAEa3AAC0twAAtLcAADU3AACOtwCAjbcAgI03AHkCu1RbhjwAkNm4AAQEu/jETDwAwJW5AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3ALDPuAAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQCgszgA4O84AC0Qu7DS3jsAANK4AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAAAetgAAuLYAAB42AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAZtwAAgjUAAHw2AABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAADmtwAARrcAAEa3AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AAAKNgAACjYAAKA2AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AAB8NgAAGbcAAII1AABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AABGNwAA5rcAAEa3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAZNwAAfDYAAIK1AACgtgAACrYAAAo2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAABGtwAA5rcAAEY3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AACKtwAAircAAIo3AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AAAKNgAACjYAAKC2AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AAB8tgAAGbcAAIK1AABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AACKtwAAircAAIq3AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAZtwAAfLYAAIK1AAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AACKtwAAijcAAIq3AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAetgAAHjYAALi2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AAAKtgAAoDYAAAq2AAC0twAAtDcAADW3AICNtwCAjTcAAI63AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAZNwAAfLYAAII1AEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AABQNQAAUDUAANA0AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AICNtwCAjTcAAI43AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AAAEtwAABDcAAIo1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AADZtgAAfLcAANk2AABQNQAAUDUAANC0AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwCAjTcAAI63AACONwCAjTcAgI23AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAACgNgAACjYAAAq2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAC4tgAAHjYAAB42AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACONwCAjTcAgI03AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACKtwAAijcAAIq3AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACAMgAAALQAAIAzAADZtgAAfDcAANm2AABQNQAAULUAANA0AACKNwAAircAAIo3AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AAAKtgAACjYAAKC2AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAECsNwBASDgAQKw3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AAB8NgAAgjUAABk3AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAC4NgAAHjYAAB42AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AABxtwAA+zUAAHE3AACAMgAAgLMAAAC0AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAACgtgAACjYAAAo2AABQNQAAULUAANC0AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACCNQAAGTcAAHy2AECsNwBASDgAQKy3AAC0twAAtLcAADU3AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AACKtwAAijcAAIo3AICNNwAAjrcAgI23AICNNwCAjbcAAI63AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAECstwBASDgAQKw3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAADmtwAARjcAAEa3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACAMgAAALQAAIAzAABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACKNwAAircAAIo3AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AABGNwAA5jcAAEY3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACKNwAAijcAAIo3AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AECsNwBASLgAQKy3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACKNwAAijcAAIq3AAAANAAAgDIAAICzAAAEtwAAirUAAAQ3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AAAeNgAAHjYAALi2AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AADZNgAA2bYAAHw3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AMBQOADAULgAwFA4AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAACgtgAACjYAAAq2AIC0twCANTcAgLS3AACAMgAAgLMAAAA0AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AMBQOADAUDgAwFA4AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AAB8NgAAgrUAABm3AAAEtwAAijUAAAQ3AACAMgAAgLMAAAC0AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AMBQOADAUDgAwFC4AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AAB8tgAAgrUAABk3AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAACgNgAACjYAAAo2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AECsNwBASLgAQKw3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AADZtgAA2TYAAHy3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAEBIOABArDcAQKw3AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AABGtwAA5jcAAEY3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AAB8NgAAGTcAAIK1AAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AABGNwAA5jcAAEa3AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2gJaQukCF6zoAQAE4AMLVugz5kDwAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAAAetgAAuLYAAB42AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3gC4Qu2DS3jsAkFG5AGabujC5PzwAwJU5AKCzuICTWzwA1M86AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1ANjeukRZhjwAqFG5AADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3QMWPOkA73zoAIJG4AIBRtgBAATgAgFE2AA0BOyQGkTwALMu4AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQCgszgA4O+4AC0QO7DS3jsAANI4AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AECvOAAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1ALDPOAAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AHkCO1RbhjwAkNk4AEisOtCTRDwA0KS5ANCkOWjgWTwAmtO6AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AMLVugz5kDwAgFG2gJaQukCF6zoAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43ANjeukRZhjwAqFE5ACb3uhB4TjwA0KQ5AAAAtAAAgLMAAICyAADmtwAARrcAAEa3AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3gC4Qu2DS3jsAkFE5AAAKNgAACjYAAKA2AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2QMWPOkA73zoAIJE4AA0BOyQGkTwALMs4ALDPOAAAGTcAAHy2AAD7NQDg77gAoLO4AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACONwCAjbcAgI03AC0QO7DS3jsAANK4AAQEO2hoTjwAwJW5ALDPOAAAfDYAABm3AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1ANb3OlRbhjwAkNm4AEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AMLVOgz5kDwAgFE2gJaQOkCF6zoAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23ANjeOkRZhjwAqFG5ACb3OhB4TjwA0KS5AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3gGwQO0AR4jsAIEi5AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2QMWPukA73zoAIJG4AA0BuyQGkTwALMu4ALDPuAAAGTcAAHw2AAD7tQDg77gAoLM4AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AC0Qu7DS3jsAANI4AAQEu2hoTjwAwJU5AACAMgAAgDMAAAA0AADZtgAA2bYAQLI4AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1ANb3ulRbhjwAkNk4AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2gJaQOkCF6zoAQAG4AMLVOgz5kDwAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03gC4QO2DS3jsAkFE5AAD4Ooh0TjwAaKE5AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1ANjeOkRZhjwAqFE5AADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AA0BuyQGkTwALMs4QMWPukA73zoAIJE4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AHkCu1RbhjwAkNm4AAQEu2hoTjwAwJW5AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3ALDPuAAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQCgszgA4O84AC0Qu7DS3jsA4FG5AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AAB8NgAAGbcAAII1AABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AABGNwAA5rcAAEa3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAZNwAAfDYAAIK1AACgtgAACrYAAAo2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPf//fz8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAwMxMPQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvf//fz8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAwMxMvQAAgD8AAACAAIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAABGtwAA5rcAAEY3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AACKtwAAircAAIo3AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AAAKNgAACjYAAKC2AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AAB8tgAAGbcAAIK1AABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AACKtwAAircAAIq3AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAZtwAAfLYAAIK1AAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgAAfLcAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AACKtwAAijcAAIq3AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAetgAAHjYAALi2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AAAKtgAAoDYAAAq2AAC0twAAtDcAADW3AICNtwCAjTcAAI63AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAZNwAAfLYAAII1AEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AABQNQAAUDUAANA0AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AICNtwCAjTcAAI43AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AAAEtwAABDcAAIo1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AADZtgAAfLcAANk2AABQNQAAUDUAANC0AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwCAjTcAAI63AACONwCAjTcAgI23AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAZtwAAfLYAAII1AABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAACgNgAACjYAAAq2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACONwCAjbcAgI23AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAC4tgAAHjYAAB42AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACAsgAAALQAAICzAAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACONwCAjTcAgI03AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACKtwAAijcAAIq3AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACAMgAAALQAAIAzAADZtgAAfDcAANm2AABQNQAAULUAANA0AACKNwAAircAAIo3AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AAAKtgAACjYAAKC2AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAECsNwBASDgAQKw3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AICNtwCAjbcAAI63AAB8NgAAgjUAABk3AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAC4NgAAHjYAAB42AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AABxtwAA+zUAAHE3AACAMgAAgLMAAAC0AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAACgtgAACjYAAAo2AABQNQAAULUAANC0AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACCNQAAGTcAAHy2AECsNwBASDgAQKy3AAC0twAAtLcAADU3AICNtwCAjbcAAI43AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACAsgAAALQAAIAzAAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AICNNwCAjTcAAI63AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACCtQAAfLYAABk3AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAEBIuABArLcAQKw3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AACKtwAAijcAAIo3AICNNwAAjrcAgI23AICNNwCAjbcAAI63AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAECstwBASDgAQKw3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AICNNwCAjTcAAI43AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAAC4tgAAHrYAAB62AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAADmtwAARjcAAEa3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACAMgAAALQAAIAzAABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACKNwAAircAAIo3AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AABGNwAA5jcAAEY3AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACKNwAAijcAAIo3AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AECsNwBASLgAQKy3AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACKNwAAijcAAIq3AAAANAAAgDIAAICzAAAEtwAAirUAAAQ3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AAAeNgAAHjYAALi2AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAAAKNgAAoLYAAAq2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAACgNgAACrYAAAq2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AAAKNgAAoDYAAAo2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAAB8NwAA2TYAANk2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACAsgAAADQAAICzAAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AADZNgAA2bYAAHw3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAAAEtwAABDcAAIq1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AMBQOADAULgAwFA4AAAANAAAgLIAAIAzAAAEtwAAijUAAAS3AAAANAAAgLMAAIAyAACgtgAACjYAAAq2AIC0twCANTcAgLS3AACAMgAAgLMAAAA0AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AAB8NgAAGTcAAII1AAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AMBQOADAUDgAwFA4AACAMwAAgDIAAAA0AAAEtwAAirUAAAS3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AAAEtwAABLcAAIq1AAAANAAAgDIAAIAzAACgtgAACrYAAAq2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AAB8NgAAGbcAAIK1AADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACKNwAAircAAIq3AAB8NgAAgrUAABm3AAAEtwAAijUAAAQ3AACAMgAAgLMAAAC0AABGNwAARrcAAOa3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAAAEtwAABDcAAIo1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AMBQOADAUDgAwFC4AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AAB8NgAAgjUAABm3AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AAB8tgAAGbcAAII1AADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AAB8tgAAgrUAABk3AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AABGtwAARrcAAOY3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACCtQAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACONwCAjbcAgI23AACONwCAjbcAgI23AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAAAENwAAijUAAAQ3AAAAtAAAgLMAAICyAACgNgAACjYAAAo2AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AAB8tgAAgrUAABm3AABGtwAARrcAAOa3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AAB8tgAAGTcAAIK1AAAKNgAAoLYAAAo2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACONwCAjbcAgI03AICNNwCAjbcAAI43AACONwCAjbcAgI03AACAswAAgDIAAAC0AAAENwAAirUAAAQ3AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAZtwAAfDYAAIK1AABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAACgNgAACrYAAAo2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AECsNwBASLgAQKw3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAZNwAAgrUAAHw2AABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAAB8twAA2TYAANm2AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AADZtgAA2TYAAHy3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACAMgAAADQAAIAzAAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAZNwAAfDYAAII1AABxtwAAcbcAAPu1AAAANAAAgDIAAIAzAEBIOABArDcAQKw3AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAC4NgAAHrYAAB62AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAAAEtwAABLcAAIo1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAANAAAgDIAAICzAABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACAMgAAgDMAAAC0AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AADZtgAA2bYAAHw3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAADZNgAAfDcAANm2AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACKtwAAircAAIo3AICNNwAAjjcAgI23AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAAB8NwAA2TYAANm2AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AAB8tgAAgjUAABk3AADZNgAA2bYAAHy3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AAB8tgAAGTcAAII1AABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AABGtwAA5jcAAEY3AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAAtAAAgDIAAIAzAABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAAB8NwAA2bYAANm2AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACKtwAAircAAIq3AACKtwAAircAAIq3AICNNwAAjjcAgI03AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACKtwAAijcAAIq3AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACAsgAAgDMAAAC0AAAKNgAACrYAAKA2AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAAtAAAgDIAAICzAEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AACAMwAAgLIAAAA0AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACCNQAAfDYAABk3AABGNwAARjcAAOY3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACAMgAAALQAAICzAAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAADZtgAAfDcAANk2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AECsNwBArLcAQEi4AIC0twCANTcAgLQ3AAAZNwAAfLYAAIK1AABxtwAAcTcAAPs1AAAANAAAgLIAAICzAAB8twAA2TYAANk2AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AAB8NgAAGTcAAIK1AAAEtwAABLcAAIo1AACCNQAAGTcAAHy2AABGNwAA5jcAAEa3AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAAB8twAA2bYAANk2AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2AIBRtgCAUbYAQAE4AEABuACAUbYAgFE2AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAAAetgAAuLYAAB42AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3AACAswAAgLIAAAA0AABxNwAA+zUAAHG3AABxNwAA+zUAAHG3AACAsgAAgLMAAAA0AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1AAAAtAAAgLIAAIAzAADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3AIBRtgCAUTYAQAE4AIBRtgBAATgAgFE2AEABuACAUTYAgFE2AACAsgAAgDMAAAA0AAD7NQAAcbcAAHG3AAD7NQAAcbcAAHG3AACAswAAgDIAAAA0AABGtwAARjcAAOY3AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwAAjrcAgI23AACKtwAAijcAAIo3AACKtwAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACCtQAAGTcAAHw2AADZNgAAfLcAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3AAAZtwAAgjUAAHw2AABxNwAA+7UAAHG3AABxNwAA+7UAAHG3AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AEABuACAUbYAgFG2AIBRtgCAUbYAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AADZNgAAfDcAANk2AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43AAAAtAAAgLIAAICzAABxNwAA+zUAAHE3AAAAtAAAgLMAAICyAADmtwAARrcAAEa3AIC0NwCANTcAgLQ3AACAsgAAgLMAAAC0AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3AACAswAAgLIAAAC0AAAKNgAACjYAAKA2AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2AIBRtgCAUTYAQAG4AEABuACAUTYAgFG2AACCtQAAGTcAAHy2AAD7NQAAcbcAAHE3AAD7NQAAcbcAAHE3AACAswAAADQAAICyAECstwBASDgAQKy3AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwAAjrcAgI03AACONwCAjbcAgI03AACAswAAgDIAAAC0AABxNwAA+7UAAHE3AACCtQAAfDYAABm3AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1AAAZtwAAgjUAAHy2AEBIuABArDcAQKy3AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AEABOACAUbYAgFE2AIBRNgCAUbYAQAE4AACAMwAAALQAAIAyAABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AADZtgAAfDcAANm2AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAAANAAAgLIAAIAzAABxtwAA+zUAAHG3AAAANAAAgLMAAIAyAADmNwAARrcAAEY3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3AAB8NgAAgrUAABk3AECsNwBArLcAQEg4AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2AIBRNgCAUTYAQAE4AEABOACAUTYAgFE2AACCNQAAGTcAAHw2AAD7tQAAcbcAAHG3AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAADZtgAAfLcAANm2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwCAjbcAgI23AACAMwAAgDIAAAA0AABxtwAA+7UAAHG3AACAMgAAgDMAAAA0AADZtgAA2bYAAHy3AIC0twCANbcAgLS3AAAANAAAgDMAAIAyAAAEtwAABLcAAIq1AAAZNwAAgjUAAHw2AAB8twAA2bYAANm2AAC0twAAtLcAADW3AIBRNgBAAbgAgFG2AIBRNgCAUbYAQAG4AEABOACAUbYAgFG2AACCNQAAGbcAAHy2AAD7tQAAcTcAAHE3AAD7tQAAcTcAAHE3AACAMwAAALQAAICyAAAKtgAAoDYAAAo2AAA1twAAtDcAALQ3AAA1twAAtDcAALQ3AACOtwCAjTcAgI03AACAMwAAgLIAAAC0AAAEtwAAijUAAAQ3AACCNQAAfLYAABm3AADZtgAA2TYAAHw3AIC0twCANTcAgLQ3AAAANAAAgLMAAICyAABxtwAAcTcAAPs1AAAANAAAgLIAAICzAADmNwAARrcAAEa3AAC0twAAtDcAADU3AIBRNgBAATgAgFG2AEABOACAUTYAgFG2AIBRNgCAUTYAQAG4AACAMwAAADQAAICyAABxtwAAcbcAAPs1AACAMgAAADQAAICzAADZtgAAfLcAANk2AAC0twAAtLcAADU3AACOtwCAjbcAgI03AAAZNwAAgjUAAHy2AABxtwAA+7UAAHE3AAAANAAAgDMAAICyAEBIOABArDcAQKy3AIC0twCANbcAgLQ3AACCNQAAfDYAABm3AAD7tQAAcbcAAHE3AAD7tQAAcbcAAHE3AACAMwAAgDIAAAC0AABGNwAARjcAAOa3AAA1twAAtLcAALQ3AAA1twAAtLcAALQ3AIBRtgBAAbgAgFE2gJaQukCF6zoAQAE4AMLVugz5kDwARNg4AACCtQAAGbcAAHw2AAD7NQAAcTcAAHG3AAD7NQAAcTcAAHG3AACAswAAALQAAIAyAECstwBASLgAQKw3AAA1NwAAtDcAALS3AAA1NwAAtDcAALS3AACONwCAjTcAgI23AICNNwCAjTcAAI63AACKtwAAircAAIo3gC4Qu2DS3jsAkFG5AGabujC5PzwAwJU5AKCzuICTWzwA1M86AACCtQAAfLYAABk3AADZNgAA2TYAAHy3AIC0NwCANTcAgLS3AIC0NwCANTcAgLS3AAAAtAAAgLMAAIAyAABxNwAAcTcAAPu1AABxNwAAcTcAAPu1ANjeukRZhjwAqFG5AADmtwAARrcAAEY3AAC0NwAAtDcAADW3AAC0NwAAtDcAADW3QMWPOkA73zoAIJG4AIBRtgBAATgAgFE2AA0BOyQGkTwALMu4ALDPOAAAfDYAABk3AAD7NQAAcbcAAHG3AAD7NQCgszgA4O+4AO8PO9CT2zsAUFs5AAAKNgAACrYAAKC2AAA1NwAAtLcAALS3AAA1NwAAtLcAALS3AICNNwCAjbcAAI63AACKtwAAijcAAIo3AECvOAAAijcAAIo3AACAswAAADQAAIAyAABxNwAAcbcAAPu1AABxNwAAcbcAAPu1AACAsgAAADQAAIAzAADZNgBAsjgAANm2AAC0NwAAtLcAADW3AAC0NwAAtLcAADW3ABADOwwrhzwA0NE4AEisOtCTRDwA0KS5ANCkOWjgWTwAmtO6AAAAtAAAgDMAAIAyAADmtwAARjcAAEY3AIC0NwCANbcAgLS3AIC0NwCANbcAgLS3AIBRtgBAAbgAgFG2AMLVugz5kDwAgFG2gJaQukCF6zoAQAG4AACAswAAALQAAICyAABxNwAAcTcAAPs1AABxNwAAcTcAAPs1AACCtQAAGbcAAHy2AECstwBASLgAQKy3AAC0NwAAtDcAADU3AAC0NwAAtDcAADU3AACONwCAjTcAgI03AACKtwAAircAAIq3AICNNwCAjTcAAI43ANjeukRZhjwAqFE5AAD4uoh0TjwAaKE5AAAAtAAAgLMAAICyAEBIuABArLcAQKy3AIC0NwCANTcAgLQ3AACCtQAAfLYAABm3AAD7NQAAcTcAAHE3AAD7NQAAcTcAAHE3gGwQu0AR4jsAIEg5AADZNgAA2TYAAHw3AAA1NwAAtDcAALQ3AAA1NwAAtDcAALQ3AIBRtgBAATgAgFG2QMWPOkA73zoAIJE4AA0BOyQGkTwALMs4ALDPOAAAGTcAAHy2AAD7NQDg77gAoLO4AAD7NQAAcbcAAHE3AACAswAAADQAAICyAADZNgBAsjgAANk2AAA1NwAAtLcAALQ3AAA1NwAAtLcAALQ3AACKtwAAijcAAIq3AICNNwCAjbcAAI43AACONwCAjbcAgI03AC0QO7DS3jsAANK4AJcDO4DITDwAKJm5AACAsgAAgDMAAAC0AABGtwAARjcAAOa3AIC0NwCANbcAgLQ3AAAAtAAAgDMAAICyAABxNwAAcbcAAPs1AABxNwAAcbcAAPs1ABADOwwrhzwA0NG4AAB8NwAA2bYAANk2AAC0NwAAtLcAADU3AAC0NwAAtLcAADU3AIBRNgBAAbgAgFE2AMLVOgz5kDwAgFE2gJaQOkCF6zoAQAE4AAB8NgAAGbcAAII1AABxtwAAcTcAAPu1AACCNQAAGbcAAHw2AABGNwAA5rcAAEY3AAC0twAAtDcAADW3AACOtwCAjTcAgI23AAbgOvwohzwAyE25AAD4Ooh0TjwAaKG5AAAANAAAgLMAAIAyAEBIOABArLcAQKw3AIC0twCANTcAgLS3AACCNQAAfLYAABk3AAD7tQAAcTcAAHG3AAD7tQAAcTcAAHG3gC4QO2DS3jsAkFG5AABGNwAARrcAAOY3AAA1twAAtDcAALS3AAA1twAAtDcAALS3AIBRNgBAATgAgFE2QMWPukA73zoAIJG4AA0BuyQGkTwALMu4AACAMgAAADQAAIAzAAD7tQDg77gAoLM4AAD7tQAAcbcAAHG3AACAMwAAADQAAIAyAAAKtgAAoLYAAAq2AAA1twAAtLcAALS3AAA1twAAtLcAALS3AACOtwBgrjgAgI23AC0Qu7DS3jsAANI4AJcDu4DITDwAKJk5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AACAP8FUzT4AAAAAAAAAAAAAgD8AAIA/AACAPwAAgD8AAIA/+mMGPwAAAAAAAAAAAACAPwAAgD8AAIA/AACAPwAAgD9U4yU/AAAAAAAAAAAAAIA/AACAPwAAgD8AAIA/AACAPwb/Qj/NvlA7AAAAAAAAgD8AAIA/AACAPwAAgD8AAIA/ZDxcP9o4+zwAAAAAAACAPwAAgD8AAIA/AACAPwAAgD+jA3A/fp+4PQAAAAAAAIA/AACAPwAAgD8AAIA/AACAPwS9fD8CnjM+AAAAAAAAgD8AAIA/AACAPwAAgD8AAIA/AACAP4ickD4AAAAAAACAPwAAgD8AAIA/AACAPwAAgD8AAIA/ulTNPgAAAAAAAIA/AACAPwAAgD8AAIA/AACAPwAAgD/+YwY/AAAAAAAAgD8AAIA/AACAPwAAgD8AAIA/AACAP1TjJT8AAAAAAACAPwAAgD8AAIA/AACAPwAAgD8AAIA/Cv9CP1C/UDsAAIA/AACAPwAAgD8AAIA/AACAPwAAgD9ePFw/fjj7PAAAgD8AAIA/AACAPwAAgD8AAIA/AACAP6UDcD+Qn7g9AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/BL18PwKeMz4AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/k5yQPgAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD/BVM0+AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP/RjBj8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/VOMlPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8B/0I/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP2E8XD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/qANwPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8EvXw/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP0Ivfz8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/OiZ4PwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8K7Gg/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP4AYUz8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/tbE3PwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD+rVRk/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwQ48z4AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/WDm0PgAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD/6A3Q+Qi9/PwAAgD8AAIA/AACAPwAAgD8AAIA/AACAP2UODz44Jng/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/xMV/PQ/saD8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8Av1A8gBhTPwAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAAAC8sTc/AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AAAAAKNVGT8AAIA/AACAPwAAgD8AAIA/AACAPwAAgD8AAAAABDjzPgAAgD8AAIA/AACAPwAAgD8AAIA/AACAPwAAAABYObQ+AACAPwAAgD8AAIA/AACAPwAAgD8AAIA/AAAAAOADdD5BL38/AACAPwAAgD8AAIA/AACAPwAAgD8AAAAAkw4PPj0meD8AAIA/AACAPwAAgD8AAIA/AACAPwAAAAB8xX89CuxoPwAAgD8AAIA/AACAPwAAgD8AAIA/AAAAAAC/UDyAGFM/AACAPwAAgD8AAIA/AACAPwAAgD8AAAAAAAAAALyxNz8AAIA/AACAPwAAgD8AAIA/AACAPwAAAAAAAAAAm1UZPwAAgD8AAIA/AACAPwAAgD8AAIA/AAAAAAAAAAD8N/M+AACAPwAAgD8AAIA/AACAPwAAgD8AAAAAAAAAAFg5tD4AAIA/AACAPwAAgD8AAIA/AACAPwAAAAAAAAAAxQN0PkAvfz8AAIA/AACAPwAAgD8AAIA/AAAAAAAAAAB8Dg8+OiZ4PwAAgD8AAIA/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" + } + ] +} diff --git a/assets/examples/models/barycentric/barycentric.gltf b/assets/examples/models/barycentric/barycentric.gltf new file mode 100644 index 0000000000..eecb2bb52c --- /dev/null +++ b/assets/examples/models/barycentric/barycentric.gltf @@ -0,0 +1,80 @@ +{ + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "count": 4, + "componentType": 5126, + "type": "VEC3", + "min": [ + -1.0, + -1.0, + 0.0 + ], + "max": [ + 1.0, + 1.0, + 0.0 + ] + }, + { + "bufferView": 0, + "byteOffset": 12, + "count": 4, + "componentType": 5126, + "type": "VEC4" + }, + { + "bufferView": 0, + "byteOffset": 28, + "count": 4, + "componentType": 5126, + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 0, + "count": 6, + "componentType": 5123, + "type": "SCALAR" + } + ], + "asset": { + "version": "2.0" + }, + "buffers": [ + { + "byteLength": 172, + "uri": "data:application/gltf-buffer;base64,AACAvwAAgL8AAAAAAACAPwAAAAAAAAAAAACAPwAAgD8AAAAAAAAAAAAAgD8AAIC/AAAAAAAAAD8AAAA/AAAAAAAAgD8AAAAAAACAPwAAAAAAAIC/AACAPwAAAAAAAAA/AAAAPwAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAAAAAAAAgD8AAAAAAACAPwAAgD8AAAAAAAAAAAAAAQACAAIAAQADAA==" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteLength": 160, + "byteOffset": 0, + "byteStride": 40, + "target": 34962 + }, + { + "buffer": 0, + "byteLength": 12, + "byteOffset": 160, + "target": 34962 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "POSITION": 0, + "COLOR_0": 1, + "__BARYCENTRIC": 2 + }, + "indices": 3 + } + ] + } + ] +} \ No newline at end of file diff --git a/assets/examples/models/cube/cube.bin b/assets/examples/models/cube/cube.bin new file mode 100644 index 0000000000..d7cde9983e Binary files /dev/null and b/assets/examples/models/cube/cube.bin differ diff --git a/assets/examples/models/cube/cube.gltf b/assets/examples/models/cube/cube.gltf new file mode 100644 index 0000000000..6a5a6ea75f --- /dev/null +++ b/assets/examples/models/cube/cube.gltf @@ -0,0 +1,122 @@ +{ + "asset" : { + "generator" : "Khronos glTF Blender I/O v1.1.46", + "version" : "2.0" + }, + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 0 + ] + } + ], + "nodes" : [ + { + "mesh" : 0, + "name" : "Cube" + } + ], + "materials" : [ + { + "doubleSided" : true, + "emissiveFactor" : [ + 0, + 0, + 0 + ], + "name" : "Material", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.800000011920929, + 0.800000011920929, + 0.800000011920929, + 1 + ], + "metallicFactor" : 0, + "roughnessFactor" : 0.4000000059604645 + } + } + ], + "meshes" : [ + { + "name" : "Cube", + "primitives" : [ + { + "attributes" : { + "POSITION" : 0, + "NORMAL" : 1, + "TEXCOORD_0" : 2 + }, + "indices" : 3, + "material" : 0 + } + ] + } + ], + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5126, + "count" : 24, + "max" : [ + 1, + 1, + 1 + ], + "min" : [ + -1, + -1, + -1 + ], + "type" : "VEC3" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 24, + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 24, + "type" : "VEC2" + }, + { + "bufferView" : 3, + "componentType" : 5123, + "count" : 36, + "type" : "SCALAR" + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 0 + }, + { + "buffer" : 0, + "byteLength" : 288, + "byteOffset" : 288 + }, + { + "buffer" : 0, + "byteLength" : 192, + "byteOffset" : 576 + }, + { + "buffer" : 0, + "byteLength" : 72, + "byteOffset" : 768 + } + ], + "buffers" : [ + { + "byteLength" : 840, + "uri" : "cube.bin" + } + ] +} diff --git a/assets/examples/models/monkey/Monkey.gltf b/assets/examples/models/monkey/Monkey.gltf new file mode 100644 index 0000000000..f7b34ed3f0 --- /dev/null +++ b/assets/examples/models/monkey/Monkey.gltf @@ -0,0 +1,122 @@ +{ + "asset" : { + "generator" : "Khronos glTF Blender I/O v1.3.48", + "version" : "2.0" + }, + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 0 + ] + } + ], + "nodes" : [ + { + "mesh" : 0, + "name" : "Suzanne" + } + ], + "materials" : [ + { + "doubleSided" : true, + "emissiveFactor" : [ + 0, + 0, + 0 + ], + "name" : "Material", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.7612724900245667, + 0.5813313126564026, + 0.41983750462532043, + 1 + ], + "metallicFactor" : 0, + "roughnessFactor" : 0.4000000059604645 + } + } + ], + "meshes" : [ + { + "name" : "Suzanne", + "primitives" : [ + { + "attributes" : { + "POSITION" : 0, + "NORMAL" : 1, + "TEXCOORD_0" : 2 + }, + "indices" : 3, + "material" : 0 + } + ] + } + ], + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5126, + "count" : 2012, + "max" : [ + 1.325934886932373, + 0.9392361640930176, + 0.8223199844360352 + ], + "min" : [ + -1.325934886932373, + -0.9704862236976624, + -0.7782661318778992 + ], + "type" : "VEC3" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 2012, + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 2012, + "type" : "VEC2" + }, + { + "bufferView" : 3, + "componentType" : 5123, + "count" : 11808, + "type" : "SCALAR" + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 24144, + "byteOffset" : 0 + }, + { + "buffer" : 0, + "byteLength" : 24144, + "byteOffset" : 24144 + }, + { + "buffer" : 0, + "byteLength" : 16096, + "byteOffset" : 48288 + }, + { + "buffer" : 0, + "byteLength" : 23616, + "byteOffset" : 64384 + } + ], + "buffers" : [ + { + "byteLength" : 88000, + "uri" : "data:application/octet-stream;base64,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NgA3AC0AMwA3AC0ANwAgADgAOQA6ADgAOgA7ADkAPAA9ADkAPQA6ADoAPQAwADoAMAAuADsAOgAuADsALgAoACAANwA+ACAAPgAhADcANgA/ADcAPwA+AD4APwBAAD4AQABBACEAPgBBACEAQQAiAEIAQwBEAEIARABFAEMAOAA7AEMAOwBEAEQAOwAoAEQAKAAlAEUARAAlAEUAJQAkADYARgBHADYARwA/AEYASABJAEYASQBHAEcASQBKAEcASgBLAD8ARwBLAD8ASwBAAEwATQBOAEwATgBPAE0AUABRAE0AUQBOAE4AUQA4AE4AOABDAE8ATgBDAE8AQwBCADQAUgBTADQAUwA1AFIAVABVAFIAVQBTAFMAVQBIAFMASABGADUAUwBGADUARgA2AFAAVgBXAFAAVwBRAFYAWABZAFYAWQBXAFcAWQA8AFcAPAA5AFEAVwA5AFEAOQA4AFQAWgBbAFQAWwBVAFoAXABdAFoAXQBbAFsAXQBeAFsAXgBfAFUAWwBfAFUAXwBIAGAAYQBiAGAAYgBjAGEAZABlAGEAZQBiAGIAZQBYAGIAWABWAGMAYgBWAGMAVgBQAEgAXwBmAEgAZgBJAF8AXgBnAF8AZwBmAGYAZwBoAGYAaABpAEkAZgBpAEkAaQBKAGoAawBsAGoAbABtAGsAYABjAGsAYwBsAGwAYwBQAGwAUABNAG0AbABNAG0ATQBMAF4AbgBvAF4AbwBnAG4AcABxAG4AcQBvAG8AcQByAG8AcgBzAGcAbwBzAGcAcwBoAHQAdQB2AHQAdgB3AHUAeAB5AHUAeQB2AHYAeQBgAHYAYABrAHcAdgBrAHcAawBqAFwAegB7AFwAewBdAHoAfAB9AHoAfQB7AHsAfQBwAHsAcABuAF0AewBuAF0AbgBeAHgAfgB/AHgAfwB5AH4AgACBAH4AgQB/AH8AgQBkAH8AZABhAHkAfwBhAHkAYQBgAHwAggCDAHwAgwB9AIIAhACFAIIAhQCDAIMAhQCGAIMAhgCHAH0AgwCHAH0AhwBwAIgAiQCKAIgAigCLAIkAjACNAIkAjQCKAIoAjQCAAIoAgAB+AIsAigB+AIsAfgB4AHAAhwCOAHAAjgBxAIcAhgCPAIcAjwCOAI4AjwCQAI4AkACRAHEAjgCRAHEAkQByAJIAkwCUAJIAlACVAJMAiACLAJMAiwCUAJQAiwB4AJQAeAB1AJUAlAB1AJUAdQB0AIYAlgCXAIYAlwCPAJYACAATAJYAEwCXAJcAEwAXAJcAFwCYAI8AlwCYAI8AmACQAB0AHACZAB0AmQCaABwAEQCbABwAmwCZAJkAmwCIAJkAiACTAJoAmQCTAJoAkwCSAIQAnACdAIQAnQCFAJwAAAADAJwAAwCdAJ0AAwAIAJ0ACACWAIUAnQCWAIUAlgCGABEAEACeABEAngCbABAADwCfABAAnwCeAJ4AnwCMAJ4AjACJAJsAngCJAJsAiQCIAAAAnACgAAAAoAChAJwAhACiAJwAogCgAKAAogCjAKAAowCkAKEAoACkAKEApAClAKYApwCoAKYAqACpAKcAjACfAKcAnwCoAKgAnwAPAKgADwCqAKkAqACqAKkAqgCrAIQAggCsAIQArACiAIIAfACtAIIArQCsAKwArQCuAKwArgCvAKIArACvAKIArwCjALAAsQCyALAAsgCzALEAgACNALEAjQCyALIAjQCMALIAjACnALMAsgCnALMApwCmAHwAegC0AHwAtACtAHoAXAC1AHoAtQC0ALQAtQC2ALQAtgC3AK0AtAC3AK0AtwCuALgAuQC6ALgAugC7ALkAZACBALkAgQC6ALoAgQCAALoAgACxALsAugCxALsAsQCwAFwAWgC8AFwAvAC1AFoAVAC9AFoAvQC8ALwAvQC+ALwAvgC/ALUAvAC/ALUAvwC2AMAAwQDCAMAAwgDDAMEAWABlAMEAZQDCAMIAZQBkAMIAZAC5AMMAwgC5AMMAuQC4AFQAUgDEAFQAxAC9AFIANADFAFIAxQDEAMQAxQDGAMQAxgDHAL0AxADHAL0AxwC+AMgAyQDKAMgAygDLAMkAPABZAMkAWQDKAMoAWQBYAMoAWADBAMsAygDBAMsAwQDAADQAMgDMADQAzADFADIALADNADIAzQDMAMwAzQDOAMwAzgDPAMUAzADPAMUAzwDGANAA0QDSANAA0gDTANEAMAA9ANEAPQDSANIAPQA8ANIAPADJANMA0gDJANMAyQDIACwAKgDUACwA1ADNACoABADVACoA1QDUANQA1QDWANQA1gDXAM0A1ADXAM0A1wDOANgA2QDaANgA2gDbANkADQAxANkAMQDaANoAMQAwANoAMADRANsA2gDRANsA0QDQAAQAAQDcAAQA3ADVAAEAAAChAAEAoQDcANwAoQClANwApQDdANUA3ADdANUA3QDWAKsAqgDeAKsA3gDfAKoADwAOAKoADgDeAN4ADgANAN4ADQDZAN8A3gDZAN8A2QDYAOAA4QDiAOAA4gDjANYA3QDiANYA4gDhAKUA4wDiAKUA4gDdAKsA3wDkAKsA5ADlANgA5gDkANgA5ADfAOcA5QDkAOcA5ADmAM4A1wDoAM4A6ADpANYA4QDoANYA6ADXAOAA6QDoAOAA6ADhAOcA5gDqAOcA6gDrANgA2wDqANgA6gDmANAA6wDqANAA6gDbAOAA7ADtAOAA7QDpAMYAzwDtAMYA7QDsAM4A6QDtAM4A7QDPANAA0wDuANAA7gDrAMgA7wDuAMgA7gDTAOcA6wDuAOcA7gDvAOAA8ADxAOAA8QDsAL4AxwDxAL4A8QDwAMYA7ADxAMYA8QDHAMgAywDyAMgA8gDvAMAA8wDyAMAA8gDLAOcA7wDyAOcA8gDzAOAA9AD1AOAA9QDwALYAvwD1ALYA9QD0AL4A8AD1AL4A9QC/AMAAwwD2AMAA9gDzALgA9wD2ALgA9gDDAOcA8wD2AOcA9gD3AOAA+AD5AOAA+QD0AK4AtwD5AK4A+QD4ALYA9AD5ALYA+QC3ALgAuwD6ALgA+gD3ALAA+wD6ALAA+gC7AOcA9wD6AOcA+gD7AOAA/AD9AOAA/QD4AKMArwD9AKMA/QD8AK4A+AD9AK4A/QCvALAAswD+ALAA/gD7AKYA/wD+AKYA/gCzAOcA+wD+AOcA/gD/AOAA4wAAAeAAAAH8AKUApAAAAaUAAAHjAKMA/AAAAaMAAAGkAKYAqQABAaYAAQH/AKsA5QABAasAAQGpAOcA/wABAecAAQHlAAIBAwEEAQIBBAEFAQMBBgEHAQMBBwEEAQQBBwEIAQQBCAEJAQUBBAEJAQUBCQEKAQgBCwEMAQgBDAEJAQsBDQEOAQsBDgEMAQwBDgEPAQwBDwEQAQkBDAEQAQkBEAEKAREBEgETAREBEwEUARIBFQEWARIBFgETARMBFgEGARMBBgEDARQBEwEDARQBAwECAQ0BFwEYAQ0BGAEOARcBGQEaARcBGgEYARgBGgEbARgBGwEcAQ4BGAEcAQ4BHAEPAR0BHgEfAR0BHwEgAR4BIQEiAR4BIgEfAR8BIgEVAR8BFQESASABHwESASABEgERARkBIwEkARkBJAEaASMBJQEmASMBJgEkASQBJgEnASQBJwEoARoBJAEoARoBKAEbASkBKgErASkBKwEsASoBLQEuASoBLgErASsBLgEhASsBIQEeASwBKwEeASwBHgEdASUBLwEwASUBMAEmAS8BMQEyAS8BMgEwATABMgEzATABMwE0ASYBMAE0ASYBNAEnATUBNgE3ATUBNwE4ATYBOQE6ATYBOgE3ATcBOgEtATcBLQEqATgBNwEqATgBKgEpATEBOwE8ATEBPAEyATsBPQE+ATsBPgE8ATwBPgE/ATwBPwFAATIBPAFAATIBQAEzAUEBQgFDAUEBQwFEAUIBRQFGAUIBRgFDAUMBRgFHAUMBRwFIAUQBQwFIAUQBSAFJAUoBSwFMAUoBTAFNAUsBTgFPAUsBTwFMAUwBTwFQAUwBUAFRAU0BTAFRAU0BUQFSAUUBUwFUAUUBVAFGAVMBVQFWAVMBVgFUAVQBVgFXAVQBVwFYAUYBVAFYAUYBWAFHAVkBWgFbAVkBWwFcAVoBXQFeAVoBXgFbAVsBXgFOAVsBTgFLAVwBWwFLAVwBSwFKAVUBXwFgAVUBYAFWAV8BYQFiAV8BYgFgAWABYgFjAWABYwFkAVYBYAFkAVYBZAFXAWUBZgFnAWUBZwFoAWYBaQFqAWYBagFnAWcBagFdAWcBXQFaAWgBZwFaAWgBWgFZAWEBawFsAWEBbAFiAWsBbQFuAWsBbgFsAWwBbgFvAWwBbwFwAWIBbAFwAWIBcAFjAXEBcgFzAXEBcwF0AXIBdQF2AXIBdgFzAXMBdgFpAXMBaQFmAXQBcwFmAXQBZgFlAW0BdwF4AW0BeAFuAXcBeQF6AXcBegF4AXgBegF7AXgBewF8AW4BeAF8AW4BfAFvAX0BfgF/AX0BfwGAAX4BgQGCAX4BggF/AX8BggF1AX8BdQFyAYABfwFyAYABcgFxAXkBgwGEAXkBhAF6AYMBhQGGAYMBhgGEAYQBhgGHAYQBhwGIAXoBhAGIAXoBiAF7AYkBigGLAYkBiwGMAYoBjQGOAYoBjgGLAYsBjgGBAYsBgQF+AYwBiwF+AYwBfgF9AYUBjwGQAYUBkAGGAY8BkQGSAY8BkgGQAZABkgGTAZABkwGUAYYBkAGUAYYBlAGHAZUBlgGXAZUBlwGYAZYBmQGaAZYBmgGXAZcBmgGNAZcBjQGKAZgBlwGKAZgBigGJAZEBmwGcAZEBnAGSAZsBnQGeAZsBngGcAZwBngGfAZwBnwGgAZIBnAGgAZIBoAGTAaEBogGjAaEBowGkAaIBpQGmAaIBpgGjAaMBpgGZAaMBmQGWAaQBowGWAaQBlgGVAZ0BpwGoAZ0BqAGeAacBqQGqAacBqgGoAagBqgGrAagBqwGsAZ4BqAGsAZ4BrAGfAa0BrgGvAa0BrwGwAa4BsQGyAa4BsgGvAa8BsgGlAa8BpQGiAbABrwGiAbABogGhAakBswG0AakBtAGqAbMBtQG2AbMBtgG0AbQBtgG3AbQBtwG4AaoBtAG4AaoBuAGrAbcBtgG5AbcBuQG6AbYBtQG7AbYBuwG5AbkBuwGxAbkBsQGuAboBuQGuAboBrgGtAbwBvQG+AbwBvgG/Ab0BwAHBAb0BwQG+Ab4BwQGfAb4BnwGsAb8BvgGsAb8BrAGrAaEBwgHDAaEBwwGwAcIBxAHFAcIBxQHDAcMBxQHGAcMBxgHHAbABwwHHAbABxwGtAcAByAHJAcAByQHBAcgBygHLAcgBywHJAckBywGTAckBkwGgAcEByQGgAcEBoAGfAZUBzAHNAZUBzQGkAcwBzgHPAcwBzwHNAc0BzwHEAc0BxAHCAaQBzQHCAaQBwgGhAdAB0QHSAdAB0gHTAdEBhwGUAdEBlAHSAdIBlAGTAdIBkwHLAdMB0gHLAdMBywHKAZUBmAHUAZUB1AHMAZgBiQHVAZgB1QHUAdQB1QHWAdQB1gHXAcwB1AHXAcwB1wHOAdgB2QHaAdgB2gHbAdkBewGIAdkBiAHaAdoBiAGHAdoBhwHRAdsB2gHRAdsB0QHQAYkBjAHcAYkB3AHVAYwBfQHdAYwB3QHcAdwB3QHeAdwB3gHfAdUB3AHfAdUB3wHWAeAB4QHiAeAB4gHjAeEBbwF8AeEBfAHiAeIBfAF7AeIBewHZAeMB4gHZAeMB2QHYAX0BgAHkAX0B5AHdAYABcQHlAYAB5QHkAeQB5QHmAeQB5gHnAd0B5AHnAd0B5wHeAegB6QHqAegB6gHrAekBYwFwAekBcAHqAeoBcAFvAeoBbwHhAesB6gHhAesB4QHgAXEBdAHsAXEB7AHlAXQBZQHtAXQB7QHsAewB7QHuAewB7gHvAeUB7AHvAeUB7wHmAfAB8QHyAfAB8gHzAfEBVwFkAfEBZAHyAfIBZAFjAfIBYwHpAfMB8gHpAfMB6QHoAWUBaAH0AWUB9AHtAWgBWQH1AWgB9QH0AfQB9QH2AfQB9gH3Ae0B9AH3Ae0B9wHuAfgB+QH6AfgB+gH7AfkBRwFYAfkBWAH6AfoBWAFXAfoBVwHxAfsB+gHxAfsB8QHwAVkBXAH8AVkB/AH1AVwBSgH9AVwB/QH8AfwB/QH+AfwB/gH/AfUB/AH/AfUB/wH2AQACAQICAgACAgIDAgECSQFIAQECSAECAgICSAFHAQICRwH5AQMCAgL5AQMC+QH4AUoBTQEEAkoBBAL9AU0BUgEFAk0BBQIEAgQCBQIGAgQCBgIHAv0BBAIHAv0BBwL+AQACCAIJAgACCQIBAggCCgILAggCCwIJAgkCCwIMAgkCDAINAgECCQINAgECDQJJAQwCDgIPAgwCDwIQAg4CEQISAg4CEgIPAg8CEgIGAg8CBgIFAhACDwIFAhACBQJSAbwBvwETArwBEwIUAr8BqwG4Ab8BuAETAhMCuAG3ARMCtwEVAhQCEwIVAhQCFQIWArcBugEXArcBFwIYAroBrQHHAboBxwEXAhcCxwHGARcCxgEZAhgCFwIZAhgCGQIaAhYCFQIbAhYCGwIcAhUCtwEdAhUCHQIbAhsCHQIeAhsCHgIfAhwCGwIfAhwCHwIgAh4CHQIhAh4CIQIiAh0CtwEYAh0CGAIhAiECGAIaAiECGgIjAiICIQIjAiICIwIkAgwCCwIlAgwCJQImAgsCCgInAgsCJwIlAiUCJwIgAiUCIAIfAiYCJQIfAiYCHwIeAiQCKAIpAiQCKQIiAigCEQIOAigCDgIpAikCDgIMAikCDAImAiICKQImAiICJgIeAioCKwIsAioCLAItAisCLgIvAisCLwIsAiwCLwIIASwCCAEHAS0CLAIHAS0CBwEGAQgBLwIwAggBMAILAS8CLgIxAi8CMQIwAjACMQIyAjACMgIzAgsBMAIzAgsBMwINATQCNQI2AjQCNgI3AjUCKgItAjUCLQI2AjYCLQIGATYCBgEWATcCNgIWATcCFgEVAQ0BMwI4Ag0BOAIXATMCMgI5AjMCOQI4AjgCOQI6AjgCOgI7AhcBOAI7AhcBOwIZATwCPQI+AjwCPgI/Aj0CNAI3Aj0CNwI+Aj4CNwIVAT4CFQEiAT8CPgIiAT8CIgEhARkBOwJAAhkBQAIjATsCOgJBAjsCQQJAAkACQQJCAkACQgJDAiMBQAJDAiMBQwIlATkBRAJFAjkBRQI6AUQCRgJHAkQCRwJFAkUCRwJIAkUCSAJJAjoBRQJJAjoBSQItAUoCSwJMAkoCTAJNAksCTgJPAksCTwJMAkwCTwI9AUwCPQE7AU0CTAI7AU0COwExATwCPwJQAjwCUAJRAj8CIQEuAT8CLgFQAlACLgEtAVACLQFJAlECUAJJAlECSQJIAjEBLwFSAjEBUgJNAi8BJQFDAi8BQwJSAlICQwJCAlICQgJTAk0CUgJTAk0CUwJKAlQCVQJWAlQCVgJXAlUCWAJZAlUCWQJWAlYCWQJaAlYCWgJbAlcCVgJbAlcCWwJGAloCWQJcAloCXAJdAlkCWAJeAlkCXgJcAlwCXgJfAlwCXwJgAl0CXAJgAl0CYAJOAkgCRwJhAkgCYQJiAkcCRgJbAkcCWwJhAmECWwJaAmECWgJjAmICYQJjAmICYwJkAloCXQJlAloCZQJjAl0CTgJLAl0CSwJlAmUCSwJKAmUCSgJmAmMCZQJmAmMCZgJkAmcCaAJpAmcCaQJqAmgCPAJRAmgCUQJpAmkCUQJIAmkCSAJiAmoCaQJiAmoCYgJkAkoCUwJrAkoCawJmAlMCQgJsAlMCbAJrAmsCbAJnAmsCZwJqAmYCawJqAmYCagJkAm0CbgJvAm0CbwJwAm4CcQJyAm4CcgJvAm8CcgJzAm8CcwJ0AnACbwJ0AnACdAJUAnUCdgJ3AnUCdwJ4AnYCeQJ6AnYCegJ3AncCegJ7AncCewJ8AngCdwJ8AngCfAJfAn0CfgJ/An0CfwKAAn4CgQKCAn4CggJ/An8CggJxAn8CcQJuAoACfwJuAoACbgJtAnkCgwKEAnkChAJ6AoMChQKGAoMChgKEAoQChgKHAoQChwKIAnoChAKIAnoCiAJ7AokCigKLAokCiwKMAooCjQKOAooCjgKLAosCjgKBAosCgQJ+AowCiwJ+AowCfgJ9AoUCjwKQAoUCkAKGAo8CkQKSAo8CkgKQApACkgKJApACiQKTAoYCkAKTAoYCkwKHApQClQKWApQClgKXApUCmAKZApUCmQKWApYCmQKNApYCjQKKApcClgKKApcCigKJApECmgKbApECmwKSApoCmAKVApoClQKbApsClQKUApsClAKXApICmwKXApIClwKJAlgCVQKcAlgCnAKdAlUCVAJ0AlUCdAKcApwCdAJzApwCcwKeAp0CnAKeAp0CngKfAnUCeAKgAnUCoAKhAngCXwJeAngCXgKgAqACXgJYAqACWAKdAqECoAKdAqECnQKfAp8CngKiAp8CogKjAp4CcwKkAp4CpAKiAqICpAKlAqICpQKmAqMCogKmAqMCpgKnAqgCqQKqAqgCqgKrAqkCdQKhAqkCoQKqAqoCoQKfAqoCnwKjAqsCqgKjAqsCowKnApgCrAKtApgCrQKZAqwCrgKvAqwCrwKtAq0CrwKwAq0CsAKxApkCrQKxApkCsQKNArICswK0ArICtAK1ArMCrgKsArMCrAK0ArQCrAKYArQCmAKaArUCtAKaArUCmgKRAo0CsQK2Ao0CtgKOArECsAK3ArECtwK2ArYCtwK4ArYCuAK5Ao4CtgK5Ao4CuQKBAroCuwK8AroCvAK9ArsCsgK1ArsCtQK8ArwCtQKRArwCkQKPAr0CvAKPAr0CjwKFAoECuQK+AoECvgKCArkCuAK/ArkCvwK+Ar4CvwLAAr4CwALBAoICvgLBAoICwQJxAsICwwLEAsICxALFAsMCugK9AsMCvQLEAsQCvQKFAsQChQKDAsUCxAKDAsUCgwJ5AnECwQLGAnECxgJyAsECwALHAsECxwLGAsYCxwKlAsYCpQKkAnICxgKkAnICpAJzAqgCyALJAqgCyQKpAsgCwgLFAsgCxQLJAskCxQJ5AskCeQJ2AqkCyQJ2AqkCdgJ1Aq4CygLLAq4CywKvAsoCwAK/AsoCvwLLAssCvwK4AssCuAK3Aq8CywK3Aq8CtwKwAroCwwLMAroCzAK7AsMCwgLNAsMCzQLMAswCzQKuAswCrgKzArsCzAKzArsCswKyAq4CzgLPAq4CzwLKAs4CpwKmAs4CpgLPAs8CpgKlAs8CpQLHAsoCzwLHAsoCxwLAAqgCqwLQAqgC0ALIAqsCpwLOAqsCzgLQAtACzgKuAtACrgLNAsgC0ALNAsgCzQLCAokCjALRAokC0QLSAowCfQLTAowC0wLRAtEC0wJJAdECSQENAtIC0QINAtICDQIMAlIB1ALVAlIB1QIQAtQChwKTAtQCkwLVAtUCkwKJAtUCiQLSAhAC1QLSAhAC0gIMAn0CgALWAn0C1gLTAoACbQLXAoAC1wLWAtYC1wLYAtYC2ALZAtMC1gLZAtMC2QJJAdoC2wLcAtoC3ALdAtsCewKIAtsCiALcAtwCiAKHAtwChwLUAt0C3ALUAt0C1AJSAW0CcALeAm0C3gLXAnACVALfAnAC3wLeAt4C3wLgAt4C4ALhAtcC3gLhAtcC4QLYAuIC4wLkAuIC5ALlAuMCXwJ8AuMCfALkAuQCfAJ7AuQCewLbAuUC5ALbAuUC2wLaAlQCVwLmAlQC5gLfAlcCRgJEAlcCRALmAuYCRAI5AeYCOQHnAt8C5gLnAt8C5wLgAj0BTwLoAj0B6ALpAk8CTgJgAk8CYALoAugCYAJfAugCXwLjAukC6ALjAukC4wLiAjUB6gLrAjUB6wI2AeoC7ALtAuoC7QLrAusC7QLgAusC4ALnAjYB6wLnAjYB5wI5AeIC7gLvAuIC7wLpAu4C8ALxAu4C8QLvAu8C8QI/Ae8CPwE+AekC7wI+AekCPgE9AewC8gLzAuwC8wLtAvIC9AL1AvIC9QLzAvMC9QLYAvMC2ALhAu0C8wLhAu0C4QLgAtoC9gL3AtoC9wLlAvYC+AL5AvYC+QL3AvcC+QLwAvcC8ALuAuUC9wLuAuUC7gLiAkEBRAH6AkEB+gL7AkQBSQHZAkQB2QL6AvoC2QLYAvoC2AL1AvsC+gL1AvsC9QL0AtoC3QL8AtoC/AL2At0CUgFRAd0CUQH8AvwCUQFQAfwCUAH9AvYC/AL9AvYC/QL4AjwCaAL+AjwC/gL/AmgCZwIAA2gCAAP+Av4CAAMBA/4CAQMCA/8C/gICA/8CAgMDAwEDAAMEAwEDBAMFAwADZwJsAgADbAIEAwQDbAJCAgQDQgIGAwUDBAMGAwUDBgMHAzQCPQIIAzQCCAMJAz0CPAL/Aj0C/wIIAwgD/wIDAwgDAwMKAwkDCAMKAwkDCgMLAwcDBgMMAwcDDAMNAwYDQgJBAgYDQQIMAwwDQQI6AgwDOgIOAw0DDAMOAw0DDgMPAyoCNQIQAyoCEAMRAzUCNAIJAzUCCQMQAxADCQMLAxADCwMSAxEDEAMSAxEDEgMTAw8DDgMUAw8DFAMVAw4DOgI5Ag4DOQIUAxQDOQIyAhQDMgIWAxUDFAMWAxUDFgMXAy4CKwIYAy4CGAMZAysCKgIRAysCEQMYAxgDEQMTAxgDEwMaAxkDGAMaAxkDGgMbAxcDFgMcAxcDHAMdAxYDMgIxAhYDMQIcAxwDMQIuAhwDLgIZAx0DHAMZAx0DGQMbAxsDGgMeAxsDHgMfAxoDEwMgAxoDIAMeAx4DIAMhAx4DIQMiAx8DHgMiAx8DIgMjAyQDJQMmAyQDJgMnAyUDFwMdAyUDHQMmAyYDHQMbAyYDGwMfAycDJgMfAycDHwMjAxMDEgMoAxMDKAMgAxIDCwMpAxIDKQMoAygDKQMqAygDKgMrAyADKAMrAyADKwMhAywDLQMuAywDLgMvAy0DDwMVAy0DFQMuAy4DFQMXAy4DFwMlAy8DLgMlAy8DJQMkAwsDCgMwAwsDMAMpAwoDAwMxAwoDMQMwAzADMQMyAzADMgMzAykDMAMzAykDMwMqAzQDNQM2AzQDNgM3AzUDBwMNAzUDDQM2AzYDDQMPAzYDDwMtAzcDNgMtAzcDLQMsAwMDAgM4AwMDOAMxAwIDAQM5AwIDOQM4AzgDOQM6AzgDOgM7AzEDOAM7AzEDOwMyAzoDOQM8AzoDPAM9AzkDAQMFAzkDBQM8AzwDBQMHAzwDBwM1Az0DPAM1Az0DNQM0AzoDPgM/AzoDPwM7Az4DIwMiAz4DIgM/Az8DIgMhAz8DIQNAAzsDPwNAAzsDQAMyAyQDJwNBAyQDQQNCAycDIwM+AycDPgNBA0EDPgM6A0EDOgM9A0IDQQM9A0IDPQM0AzIDQANDAzIDQwMzAyEDKwNDAyEDQwNAAyoDMwNDAyoDQwMrAywDLwNEAywDRAM3AyQDQgNEAyQDRAMvAzQDNwNEAzQDRANCAyACJwJFAyACRQNGAycCCgJHAycCRwNFA0UDRwNIA0UDSANJA0YDRQNJA0YDSQNKA0sDTANNA0sDTQNOA0wDEQIoAkwDKAJNA00DKAIkAk0DJAJPA04DTQNPA04DTwNQAxYCHAJRAxYCUQNSAxwCIAJGAxwCRgNRA1EDRgNKA1EDSgNTA1IDUQNTA1IDUwNUA1ADTwNVA1ADVQNWA08DJAIjAk8DIwJVA1UDIwIaAlUDGgJXA1YDVQNXA1YDVwNYA7wBFAJZA7wBWQNaAxQCFgJSAxQCUgNZA1kDUgNUA1kDVANbA1oDWQNbA1oDWwNcA1gDVwNdA1gDXQNeA1cDGgIZAlcDGQJdA10DGQLGAV0DxgFfA14DXQNfA14DXwNgAwoCCAJhAwoCYQNHAwgCAAJiAwgCYgNhA2EDYgNjA2EDYwNkA0cDYQNkA0cDZANIA2UDZgNnA2UDZwNoA2YDBgISAmYDEgJnA2cDEgIRAmcDEQJMA2gDZwNMA2gDTANLAwACAwJpAwACaQNiAwMC+AFqAwMCagNpA2kDagNrA2kDawNsA2IDaQNsA2IDbANjA20DbgNvA20DbwNwA24D/gEHAm4DBwJvA28DBwIGAm8DBgJmA3ADbwNmA3ADZgNlA/gB+wFxA/gBcQNqA/sB8AFyA/sBcgNxA3EDcgNzA3EDcwN0A2oDcQN0A2oDdANrA3UDdgN3A3UDdwN4A3YD9gH/AXYD/wF3A3cD/wH+AXcD/gFuA3gDdwNuA3gDbgNtA/AB8wF5A/ABeQNyA/MB6AF6A/MBegN5A3kDegN7A3kDewN8A3IDeQN8A3IDfANzA30DfgN/A30DfwOAA34D7gH3AX4D9wF/A38D9wH2AX8D9gF2A4ADfwN2A4ADdgN1A+gB6wGBA+gBgQN6A+sB4AGCA+sBggOBA4EDggODA4EDgwOEA3oDgQOEA3oDhAN7A4UDhgOHA4UDhwOIA4YD5gHvAYYD7wGHA4cD7wHuAYcD7gF+A4gDhwN+A4gDfgN9A+AB4wGJA+ABiQOCA+MB2AGKA+MBigOJA4kDigOLA4kDiwOMA4IDiQOMA4IDjAODA40DjgOPA40DjwOQA44D3gHnAY4D5wGPA48D5wHmAY8D5gGGA5ADjwOGA5ADhgOFA9gB2wGRA9gBkQOKA9sB0AGSA9sBkgORA5EDkgOTA5EDkwOUA4oDkQOUA4oDlAOLA5UDlgOXA5UDlwOYA5YD1gHfAZYD3wGXA5cD3wHeAZcD3gGOA5gDlwOOA5gDjgONA9AB0wGZA9ABmQOSA9MBygGaA9MBmgOZA5kDmgObA5kDmwOcA5IDmQOcA5IDnAOTA50DngOfA50DnwOgA54DzgHXAZ4D1wGfA58D1wHWAZ8D1gGWA6ADnwOWA6ADlgOVA8oByAGhA8oBoQOaA8gBwAGiA8gBogOhA6EDogOjA6EDowOkA5oDoQOkA5oDpAObA6UDpgOnA6UDpwOoA6YDxAHPAaYDzwGnA6cDzwHOAacDzgGeA6gDpwOeA6gDngOdA8ABvQGpA8ABqQOiA70BvAFaA70BWgOpA6kDWgNcA6kDXAOqA6IDqQOqA6IDqgOjA2ADXwOrA2ADqwOsA18DxgHFAV8DxQGrA6sDxQHEAasDxAGmA6wDqwOmA6wDpgOlA6MDqgOtA6MDrQOuA6oDXAOvA6oDrwOtA60DrwOwA60DsAOxA64DrQOxA64DsQOyA7MDtAO1A7MDtQO2A7QDYAOsA7QDrAO1A7UDrAOlA7UDpQO3A7YDtQO3A7YDtwO4A5sDpAO5A5sDuQO6A6QDowOuA6QDrgO5A7kDrgOyA7kDsgO7A7oDuQO7A7oDuwO8A7gDtwO9A7gDvQO+A7cDpQOoA7cDqAO9A70DqAOdA70DnQO/A74DvQO/A74DvwPAA5MDnAPBA5MDwQPCA5wDmwO6A5wDugPBA8EDugO8A8EDvAPDA8IDwQPDA8IDwwPEA8ADvwPFA8ADxQPGA78DnQOgA78DoAPFA8UDoAOVA8UDlQPHA8YDxQPHA8YDxwPIA4sDlAPJA4sDyQPKA5QDkwPCA5QDwgPJA8kDwgPEA8kDxAPLA8oDyQPLA8oDywPMA8gDxwPNA8gDzQPOA8cDlQOYA8cDmAPNA80DmAONA80DjQPPA84DzQPPA84DzwPQA4MDjAPRA4MD0QPSA4wDiwPKA4wDygPRA9EDygPMA9EDzAPTA9ID0QPTA9ID0wPUA9ADzwPVA9AD1QPWA88DjQOQA88DkAPVA9UDkAOFA9UDhQPXA9YD1QPXA9YD1wPYA3sDhAPZA3sD2QPaA4QDgwPSA4QD0gPZA9kD0gPUA9kD1APbA9oD2QPbA9oD2wPcA9gD1wPdA9gD3QPeA9cDhQOIA9cDiAPdA90DiAN9A90DfQPfA94D3QPfA94D3wPgA3MDfAPhA3MD4QPiA3wDewPaA3wD2gPhA+ED2gPcA+ED3APjA+ID4QPjA+ID4wPkA+AD3wPlA+AD5QPmA98DfQOAA98DgAPlA+UDgAN1A+UDdQPnA+YD5QPnA+YD5wPoA2sDdAPpA2sD6QPqA3QDcwPiA3QD4gPpA+kD4gPkA+kD5APrA+oD6QPrA+oD6wPsA+gD5wPtA+gD7QPuA+cDdQN4A+cDeAPtA+0DeANtA+0DbQPvA+4D7QPvA+4D7wPwA2MDbAPxA2MD8QPyA2wDawPqA2wD6gPxA/ED6gPsA/ED7APzA/ID8QPzA/ID8wP0A/AD7wP1A/AD9QP2A+8DbQNwA+8DcAP1A/UDcANlA/UDZQP3A/YD9QP3A/YD9wP4A0gDZAP5A0gD+QP6A2QDYwPyA2QD8gP5A/kD8gP0A/kD9AP7A/oD+QP7A/oD+wP8A/gD9wP9A/gD/QP+A/cDZQNoA/cDaAP9A/0DaANLA/0DSwP/A/4D/QP/A/4D/wMABFwDWwMBBFwDAQSvA1sDVAMCBFsDAgQBBAEEAgQDBAEEAwQEBK8DAQQEBK8DBASwAwUEBgQHBAUEBwQIBAYEWANeAwYEXgMHBAcEXgNgAwcEYAO0AwgEBwS0AwgEtAOzA1QDUwMJBFQDCQQCBFMDSgMKBFMDCgQJBAkECgQLBAkECwQMBAIECQQMBAIEDAQDBA0EDgQPBA0EDwQQBA4EUANWAw4EVgMPBA8EVgNYAw8EWAMGBBAEDwQGBBAEBgQFBEoDSQMRBEoDEQQKBEkDSAP6A0kD+gMRBBEE+gP8AxEE/AMSBAoEEQQSBAoEEgQLBAAE/wMTBAAEEwQUBP8DSwNOA/8DTgMTBBMETgNQAxMEUAMOBBQEEwQOBBQEDgQNBLUBswEVBLUBFQQWBLMBqQEXBLMBFwQVBBUEFwQYBBUEGAQZBBYEFQQZBBYEGQQaBBsEHAQdBBsEHQQeBBwEsQG7ARwEuwEdBB0EuwG1AR0EtQEWBB4EHQQWBB4EFgQaBKkBpwEfBKkBHwQXBKcBnQEgBKcBIAQfBB8EIAQhBB8EIQQiBBcEHwQiBBcEIgQYBCMEJAQlBCMEJQQmBCQEpQGyASQEsgElBCUEsgGxASUEsQEcBCYEJQQcBCYEHAQbBJ0BmwEnBJ0BJwQgBJsBkQEoBJsBKAQnBCcEKAQpBCcEKQQqBCAEJwQqBCAEKgQhBCsELAQtBCsELQQuBCwEmQGmASwEpgEtBC0EpgGlAS0EpQEkBC4ELQQkBC4EJAQjBJEBjwEvBJEBLwQoBI8BhQEwBI8BMAQvBC8EMAQxBC8EMQQyBCgELwQyBCgEMgQpBDMENAQ1BDMENQQ2BDQEjQGaATQEmgE1BDUEmgGZATUEmQEsBDYENQQsBDYELAQrBIUBgwE3BIUBNwQwBIMBeQE4BIMBOAQ3BDcEOAQ5BDcEOQQ6BDAENwQ6BDAEOgQxBDsEPAQ9BDsEPQQ+BDwEgQGOATwEjgE9BD0EjgGNAT0EjQE0BD4EPQQ0BD4ENAQzBHkBdwE/BHkBPwQ4BHcBbQFABHcBQAQ/BD8EQARBBD8EQQRCBDgEPwRCBDgEQgQ5BEMERARFBEMERQRGBEQEdQGCAUQEggFFBEUEggGBAUUEgQE8BEYERQQ8BEYEPAQ7BG0BawFHBG0BRwRABGsBYQFIBGsBSARHBEcESARJBEcESQRKBEAERwRKBEAESgRBBEsETARNBEsETQROBEwEaQF2AUwEdgFNBE0EdgF1AU0EdQFEBE4ETQREBE4ERARDBGEBXwFPBGEBTwRIBF8BVQFQBF8BUARPBE8EUARRBE8EUQRSBEgETwRSBEgEUgRJBFMEVARVBFMEVQRWBFQEXQFqAVQEagFVBFUEagFpAVUEaQFMBFYEVQRMBFYETARLBFUBUwFXBFUBVwRQBFMBRQFYBFMBWARXBFcEWARZBFcEWQRaBFAEVwRaBFAEWgRRBFsEXARdBFsEXQReBFwETgFeAVwEXgFdBF0EXgFdAV0EXQFUBF4EXQRUBF4EVARTBF8EYARhBF8EYQRiBGAEYwRkBGAEZARhBGEEZARlBGEEZQRmBGIEYQRmBGIEZgRnBGgEaQRqBGgEagRrBGkEYwRgBGkEYARqBGoEYARfBGoEXwRsBGsEagRsBGsEbARtBG4EbwRwBG4EcARxBG8EXwRiBG8EYgRwBHAEYgRnBHAEZwRyBHEEcARyBHEEcgRzBG0EbAR0BG0EdAR1BGwEXwRvBGwEbwR0BHQEbwRuBHQEbgR2BHUEdAR2BHUEdgR3BHgEeQR6BHgEegR7BHkEbgRxBHkEcQR6BHoEcQRzBHoEcwR8BHsEegR8BHsEfAR9BHcEdgR+BHcEfgR/BHYEbgR5BHYEeQR+BH4EeQR4BH4EeASABH8EfgSABH8EgASBBAIBBQGCBAIBggSDBAUBCgGEBAUBhASCBIIEhAR4BIIEeAR7BIMEggR7BIMEewR9BHgEhASFBHgEhQSABIQECgEQAYQEEAGFBIUEEAEPAYUEDwGGBIAEhQSGBIAEhgSBBBEBFAGHBBEBhwSIBBQBAgGDBBQBgwSHBIcEgwR9BIcEfQSJBIgEhwSJBIgEiQSKBIEEhgSLBIEEiwSMBIYEDwEcAYYEHAGLBIsEHAEbAYsEGwGNBIwEiwSNBIwEjQSOBB0BIAGPBB0BjwSQBCABEQGIBCABiASPBI8EiASKBI8EigSRBJAEjwSRBJAEkQSSBI4EjQSTBI4EkwSUBI0EGwEoAY0EKAGTBJMEKAEnAZMEJwGVBJQEkwSVBJQElQSWBCkBLAGXBCkBlwSYBCwBHQGQBCwBkASXBJcEkASSBJcEkgSZBJgElwSZBJgEmQSaBJYElQSbBJYEmwScBJUEJwE0AZUENAGbBJsENAEzAZsEMwGdBJwEmwSdBJwEnQSeBJIEnwSgBJIEoASZBJ8EcwRyBJ8EcgSgBKAEcgRnBKAEZwShBJkEoAShBJkEoQSaBG0EdQSiBG0EogSjBHUEdwSkBHUEpASiBKIEpASWBKIElgScBKMEogScBKMEnASeBJIEkQSlBJIEpQSfBJEEigSJBJEEiQSlBKUEiQR9BKUEfQR8BJ8EpQR8BJ8EfARzBIEEjASmBIEEpgR/BIwEjgSUBIwElASmBKYElASWBKYElgSkBH8EpgSkBH8EpAR3BKcEqASpBKcEqQSqBKgEmgShBKgEoQSpBKkEoQRnBKkEZwRmBKoEqQRmBKoEZgRlBG0EowSrBG0EqwRrBKMEngSsBKMErASrBKsErAStBKsErQSuBGsEqwSuBGsErgRoBDUBOAGvBDUBrwSwBDgBKQGYBDgBmASvBK8EmASaBK8EmgSoBLAErwSoBLAEqASnBJ4EnQSxBJ4EsQSsBJ0EMwFAAZ0EQAGxBLEEQAE/AbEEPwGyBKwEsQSyBKwEsgStBOwCswS0BOwCtATyArMEtQS2BLMEtgS0BLQEtgS3BLQEtwS4BPICtAS4BPICuAT0ArkEugS7BLkEuwS8BLoEvQS+BLoEvgS7BLsEvgTwArsE8AL5ArwEuwT5ArwE+QL4AjUBsAS/BDUBvwTqArAEpwTABLAEwAS/BL8EwAS1BL8EtQSzBOoCvwSzBOoCswTsAr0EwQTCBL0EwgS+BMEErQSyBMEEsgTCBMIEsgQ/AcIEPwHxAr4EwgTxAr4E8QLwAkEB+wLDBEEBwwTEBPsC9AK4BPsCuATDBMMEuAS3BMMEtwTFBMQEwwTFBMQExQTGBLkEvATHBLkExwTIBLwE+AL9ArwE/QLHBMcE/QJQAccEUAHJBMgExwTJBMgEyQTKBEEBxATLBEEBywRCAcQExgTMBMQEzATLBMsEzARZBMsEWQRYBEIBywRYBEIBWARFAVsEzQTOBFsEzgRcBM0EygTJBM0EyQTOBM4EyQRQAc4EUAFPAVwEzgRPAVwETwFOAc8E0ATRBM8E0QTSBNAE0wTUBNAE1ATRBNEE1ATVBNEE1QTWBNIE0QTWBNIE1gTXBNgE2QTaBNgE2gTbBNkE3ATdBNkE3QTaBNoE3QTPBNoEzwTSBNsE2gTSBNsE0gTXBNcE1gTeBNcE3gTfBNYE1QTgBNYE4ATeBN4E4AThBN4E4QTiBN8E3gTiBN8E4gTjBOQE5QTmBOQE5gTnBOUE2ATbBOUE2wTmBOYE2wTXBOYE1wTfBOcE5gTfBOcE3wTjBOME4gToBOME6ATpBOIE4QTqBOIE6gToBOgE6gTrBOgE6wTsBOkE6ATsBOkE7ATtBO4E7wTwBO4E8ATxBO8E5ATnBO8E5wTwBPAE5wTjBPAE4wTpBPEE8ATpBPEE6QTtBO0E7ATyBO0E8gTzBOwE6wT0BOwE9ATyBPIE9ARlBPIEZQRkBPME8gRkBPMEZARjBGgE9QT2BGgE9gRpBPUE7gTxBPUE8QT2BPYE8QTtBPYE7QTzBGkE9gTzBGkE8wRjBKcEqgT3BKcE9wTABKoEZQT0BKoE9AT3BPcE9ATrBPcE6wT4BMAE9wT4BMAE+AS1BO4E9QT5BO4E+QT6BPUEaASuBPUErgT5BPkErgStBPkErQTBBPoE+QTBBPoEwQS9BEkEUgT7BEkE+wT8BFIEUQT9BFIE/QT7BPsE/QT+BPsE/gT/BPwE+wT/BPwE/wQABQEFAgUDBQEFAwUEBQIFUwRWBAIFVgQDBQMFVgRLBAMFSwQFBQQFAwUFBQQFBQUGBQcFCAUJBQcFCQUKBQgFCwUMBQgFDAUJBQkFDAXTBAkF0wTQBAoFCQXQBAoF0ATPBNwEDQUOBdwEDgXdBA0FDwUQBQ0FEAUOBQ4FEAUHBQ4FBwUKBd0EDgUKBd0ECgXPBBEFEgUTBREFEwUUBRIFFQUWBRIFFgUTBRMFFgUXBRMFFwUYBRQFEwUYBRQFGAUZBRoFGwUcBRoFHAUdBRsFHgUfBRsFHwUcBRwFHwURBRwFEQUUBR0FHAUUBR0FFAUZBRkFGAUgBRkFIAUhBRgFFwUiBRgFIgUgBSAFIgUjBSAFIwUkBSEFIAUkBSEFJAUlBSYFJwUoBSYFKAUpBScFGgUdBScFHQUoBSgFHQUZBSgFGQUhBSkFKAUhBSkFIQUlBSUFJAUqBSUFKgUrBSQFIwUsBSQFLAUqBSoFLAULBSoFCwUIBSsFKgUIBSsFCAUHBQ8FLQUuBQ8FLgUQBS0FJgUpBS0FKQUuBS4FKQUlBS4FJQUrBRAFLgUrBRAFKwUHBTkEQgQvBTkELwUwBUIEQQQxBUIEMQUvBS8FMQUyBS8FMgUzBTAFLwUzBTAFMwU0BTUFNgU3BTUFNwU4BTYFQwRGBDYFRgQ3BTcFRgQ7BDcFOwQ5BTgFNwU5BTgFOQU6BTQFMwU7BTQFOwU8BTMFMgU9BTMFPQU7BTsFPQU+BTsFPgU/BTwFOwU/BTwFPwVABUEFQgVDBUEFQwVEBUIFNQU4BUIFOAVDBUMFOAU6BUMFOgVFBUQFQwVFBUQFRQVGBUAFPwVHBUAFRwVIBT8FPgVJBT8FSQVHBUcFSQVKBUcFSgVLBUgFRwVLBUgFSwVMBU0FTgVPBU0FTwVQBU4FQQVEBU4FRAVPBU8FRAVGBU8FRgVRBVAFTwVRBVAFUQVSBUwFSwVTBUwFUwVUBUsFSgVVBUsFVQVTBVMFVQVWBVMFVgVXBVQFUwVXBVQFVwVYBVkFWgVbBVkFWwVcBVoFTQVQBVoFUAVbBVsFUAVSBVsFUgVdBVwFWwVdBVwFXQVeBV8FYAVhBV8FYQViBWAFYwVkBWAFZAVhBWEFZAVYBWEFWAVXBWIFYQVXBWIFVwVWBV4FZQVmBV4FZgVcBWUFZwVoBWUFaAVmBWYFaAVpBWYFaQVqBVwFZgVqBVwFagVZBQsFLAVrBQsFawVsBSwFIwVtBSwFbQVrBWsFbQVYBWsFWAVkBWwFawVkBWwFZAVjBV4FbgVvBV4FbwVlBW4FJgUtBW4FLQVvBW8FLQUPBW8FDwVwBWUFbwVwBWUFcAVnBSMFIgVxBSMFcQVtBSIFFwVyBSIFcgVxBXEFcgVMBXEFTAVUBW0FcQVUBW0FVAVYBVIFcwV0BVIFdAVdBXMFGgUnBXMFJwV0BXQFJwUmBXQFJgVuBV0FdAVuBV0FbgVeBRcFFgV1BRcFdQVyBRYFFQV2BRYFdgV1BXUFdgVABXUFQAVIBXIFdQVIBXIFSAVMBUYFdwV4BUYFeAVRBXcFHgUbBXcFGwV4BXgFGwUaBXgFGgVzBVEFeAVzBVEFcwVSBRUFeQV6BRUFegV2BXkFewV8BXkFfAV6BXoFfAU0BXoFNAU8BXYFegU8BXYFPAVABToFfQV+BToFfgVFBX0FfwWABX0FgAV+BX4FgAUeBX4FHgV3BUUFfgV3BUUFdwVGBTEEOgSBBTEEgQWCBToEOQQwBToEMAWBBYEFMAU0BYEFNAV8BYIFgQV8BYIFfAV7BToFOQWDBToFgwV9BTkFOwQ+BDkFPgSDBYMFPgQzBIMFMwSEBX0FgwWEBX0FhAV/BYUFhgWHBYUFhwWIBYYFewV5BYYFeQWHBYcFeQUVBYcFFQUSBYgFhwUSBYgFEgURBR4FgAWJBR4FiQUfBYAFfwWKBYAFigWJBYkFigWFBYkFhQWIBR8FiQWIBR8FiAURBRgEIgSLBRgEiwWMBSIEIQQqBCIEKgSLBYsFKgQpBIsFKQQyBIwFiwUyBIwFMgQxBCsELgSNBSsEjQU2BC4EIwQmBC4EJgSNBY0FJgQbBI0FGwSOBTYEjQWOBTYEjgUzBBgEjAWPBRgEjwWQBYwFMQSCBYwFggWPBY8FggV7BY8FewWGBZAFjwWGBZAFhgWFBX8FhAWRBX8FkQWKBYQFMwSOBYQFjgWRBZEFjgUbBJEFGwSSBYoFkQWSBYoFkgWFBRoEGQSTBRoEkwWUBRgEkAWTBRgEkwUZBIUFlAWTBYUFkwWQBYUFkgWVBYUFlQWUBRsEHgSVBRsElQWSBRoElAWVBRoElQUeBEEESgSWBUEElgUxBUoESQT8BEoE/ASWBZYF/AQABZYFAAWXBTEFlgWXBTEFlwUyBQYFBQWYBQYFmAWZBQUFSwROBAUFTgSYBZgFTgRDBJgFQwQ2BZkFmAU2BZkFNgU1BQAFmgWbBQAFmwWXBZoFnAWdBZoFnQWbBZsFnQU+BZsFPgU9BZcFmwU9BZcFPQUyBUEFngWfBUEFnwVCBZ4FoAWhBZ4FoQWfBZ8FoQUGBZ8FBgWZBUIFnwWZBUIFmQU1BZwFogWjBZwFowWdBaIFpAWlBaIFpQWjBaMFpQVKBaMFSgVJBZ0FowVJBZ0FSQU+BU0FpgWnBU0FpwVOBaYFqAWpBaYFqQWnBacFqQWgBacFoAWeBU4FpwWeBU4FngVBBV8FYgWqBV8FqgWrBWIFVgVVBWIFVQWqBaoFVQVKBaoFSgWlBasFqgWlBasFpQWkBU0FWgWsBU0FrAWmBVoFWQVqBVoFagWsBawFagVpBawFaQWtBaYFrAWtBaYFrQWoBesE6gSuBesErgWvBeoE4QSwBeoEsAWuBa4FsAWxBa4FsQWyBa8FrgWyBa8FsgWzBbQFtQW2BbQFtgW3BbUF5ATvBLUF7wS2BbYF7wTuBLYF7gS4BbcFtgW4BbcFuAW5Bf4EugW7Bf4EuwW8BboFswWyBboFsgW7BbsFsgWxBbsFsQW9BbwFuwW9BbwFvQW+BbQFtwW/BbQFvwXABbcFuQXBBbcFwQW/Bb8FwQUBBb8FAQXCBcAFvwXCBcAFwgXDBVEEWgTEBVEExAX9BFoEWQTFBVoExQXEBcQFxQWzBcQFswW6Bf0ExAW6Bf0EugX+BLkFxgXHBbkFxwXBBcYFWwReBMYFXgTHBccFXgRTBMcFUwQCBcEFxwUCBcEFAgUBBVkEyAXJBVkEyQXFBcgFtwS2BMgFtgTJBckFtgS1BMkFtQTKBcUFyQXKBcUFygWzBb0EugTLBb0EywXMBboEuQTNBboEzQXLBcsFzQVbBMsFWwTGBcwFywXGBcwFxgW5BbUE+ATOBbUEzgXKBesErwXOBesEzgX4BLMFygXOBbMFzgWvBbkFuAXPBbkFzwXMBe4E+gTPBe4EzwW4Bb0EzAXPBb0EzwX6BFkEzATQBVkE0AXIBcYExQTQBcYE0AXMBLcEyAXQBbcE0AXFBLkEyATRBbkE0QXNBcoEzQTRBcoE0QXIBFsEzQXRBVsE0QXNBF8F0gXTBV8F0wVgBdIF1AXVBdIF1QXTBdMF1QXWBdMF1gXXBWAF0wXXBWAF1wVjBdgF2QXaBdgF2gXbBdkF3AXdBdkF3QXaBdoF3QVpBdoFaQVoBdsF2gVoBdsFaAVnBQsFbAXeBQsF3gUMBWwFYwXXBWwF1wXeBd4F1wXWBd4F1gXfBQwF3gXfBQwF3wXTBNgF2wXgBdgF4AXhBdsFZwVwBdsFcAXgBeAFcAUPBeAFDwUNBeEF4AUNBeEFDQXcBL4FvQXiBb4F4gXjBb0FsQXkBb0F5AXiBeIF5AXWBeIF1gXVBeMF4gXVBeMF1QXUBdgF5QXmBdgF5gXZBeUFtAXABeUFwAXmBeYFwAXDBeYFwwXnBdkF5gXnBdkF5wXcBeEE4AToBeEE6AWwBeAE1QTpBeAE6QXoBegF6QXWBegF1gXkBbAF6AXkBbAF5AWxBdgF6gXrBdgF6wXlBeoF2ATlBOoF5QTrBesF5QTkBOsF5AS1BeUF6wW1BeUFtQW0BdME3wXsBdME7AXUBNYF6QXsBdYF7AXfBdUE1ATsBdUE7AXpBdgE6gXtBdgE7QXZBNgF4QXtBdgF7QXqBdwE2QTtBdwE7QXhBe4F7wXwBe4F8AXxBe8F8gXzBe8F8wXwBfAF8wX0BfAF9AX1BfEF8AX1BfEF9QX2BfcF+AX5BfcF+QX6BfgF+wX8BfgF/AX5BfkF/AX9BfkF/QX+BfoF+QX+BfoF/gX/Be4F8QUABu4FAAYBBvEF9gUCBvEFAgYABgAGAgYDBgAGAwYEBgEGAAYEBgEGBAYFBgYGBwYIBgYGCAYJBgcG/wX+BQcG/gUIBggG/gX9BQgG/QUKBgkGCAYKBgkGCgYLBgUGBAYMBgUGDAYNBgQGAwYOBgQGDgYMBgwGDgYPBgwGDwYQBg0GDAYQBg0GEAYRBhIGEwYUBhIGFAYVBhMGBgYJBhMGCQYUBhQGCQYLBhQGCwYWBhUGFAYWBhUGFgYXBhEGEAYYBhEGGAYZBhAGDwYaBhAGGgYYBhgGGgYbBhgGGwYcBhkGGAYcBhkGHAYdBh4GHwYgBh4GIAYhBh8GEgYVBh8GFQYgBiAGFQYXBiAGFwYiBiEGIAYiBiEGIgYjBh0GHAYkBh0GJAYlBhwGGwYmBhwGJgYkBiQGJgYnBiQGJwYoBiUGJAYoBiUGKAYpBioGKwYsBioGLAYtBisGHgYhBisGIQYsBiwGIQYjBiwGIwYuBi0GLAYuBi0GLgYvBikGKAYwBikGMAYxBigGJwYyBigGMgYwBjAGMgYzBjAGMwY0BjEGMAY0BjEGNAY1BjYGNwY4BjYGOAY5BjcGKgYtBjcGLQY4BjgGLQYvBjgGLwY6BjkGOAY6BjkGOgY7BicGPAY9BicGPQYyBjwGPgY/BjwGPwY9Bj0GPwZABj0GQAZBBjIGPQZBBjIGQQYzBkIGQwZEBkIGRAZFBkMGRgZHBkMGRwZEBkQGRwYqBkQGKgY3BkUGRAY3BkUGNwY2BhsGSAZJBhsGSQYmBkgGSgZLBkgGSwZJBkkGSwY+BkkGPgY8BiYGSQY8BiYGPAYnBkYGTAZNBkYGTQZHBkwGTgZPBkwGTwZNBk0GTwYeBk0GHgYrBkcGTQYrBkcGKwYqBg8GUAZRBg8GUQYaBlAGUgZTBlAGUwZRBlEGUwZKBlEGSgZIBhoGUQZIBhoGSAYbBk4GVAZVBk4GVQZPBlQGVgZXBlQGVwZVBlUGVwYSBlUGEgYfBk8GVQYfBk8GHwYeBgMGWAZZBgMGWQYOBlgGWgZbBlgGWwZZBlkGWwZSBlkGUgZQBg4GWQZQBg4GUAYPBlYGXAZdBlYGXQZXBlwGXgZfBlwGXwZdBl0GXwYGBl0GBgYTBlcGXQYTBlcGEwYSBvYFYAZhBvYFYQYCBmAGYgZjBmAGYwZhBmEGYwZaBmEGWgZYBgIGYQZYBgIGWAYDBl4GZAZlBl4GZQZfBmQGZgZnBmQGZwZlBmUGZwb/BWUG/wUHBl8GZQYHBl8GBwYGBvYF9QVoBvYFaAZgBvUF9AVpBvUFaQZoBmgGaQZqBmgGagZrBmAGaAZrBmAGawZiBmwGbQZuBmwGbgZvBm0G9wX6BW0G+gVuBm4G+gX/BW4G/wVnBm8GbgZnBm8GZwZmBv4EvAVwBv4EcAZxBrwFvgVyBrwFcgZwBnAGcgZzBnAGcwZ0BnEGcAZ0BnEGdAZ1BnYGdwZ4BnYGeAZ5BncGwwXCBXcGwgV4BngGwgUBBXgGAQV6BnkGeAZ6BnkGegZ7Br4FfAZ9Br4FfQZyBnwGNQY0BnwGNAZ9Bn0GNAYzBn0GMwZ+BnIGfQZ+BnIGfgZzBjYGOQZ/BjYGfwaABjkGOwaBBjkGgQZ/Bn8GgQbDBX8GwwV3BoAGfwZ3BoAGdwZ2BgAF/wSCBgAFggaaBf8E/gRxBv8EcQaCBoIGcQZ1BoIGdQaDBpoFggaDBpoFgwacBXsGegaEBnsGhAaFBnoGAQUEBXoGBAWEBoQGBAUGBYQGBgWhBYUGhAahBYUGoQWgBaQFhgaHBqQFhwaIBoYGiQaKBoYGigaHBocGigb0BYcG9AXzBYgGhwbzBYgG8wXyBfcFiwaMBvcFjAb4BYsGjQaOBosGjgaMBowGjgaoBYwGqAWPBvgFjAaPBvgFjwb7BTMGQQaQBjMGkAZ+BkEGQAaRBkEGkQaQBpAGkQaSBpAGkgaTBn4GkAaTBn4GkwZzBpQGlQaWBpQGlgaXBpUGQgZFBpUGRQaWBpYGRQY2BpYGNgaABpcGlgaABpcGgAZ2BpgGmQaaBpgGmgabBpkGnAadBpkGnQaaBpoGnQZzBpoGcwaTBpsGmgaTBpsGkwaSBnYGngafBnYGnwaXBp4GoAahBp4GoQafBp8GoQaiBp8GogajBpcGnwajBpcGowaUBqQGpQamBqQGpganBqUGnAaZBqUGmQamBqYGmQaYBqYGmAaoBqcGpgaoBqcGqAapBqIGoQaqBqIGqgarBqEGoAasBqEGrAaqBqoGrAatBqoGrQauBqsGqgauBqsGrgavBrAGsQayBrAGsgazBrEGtAa1BrEGtQayBrIGtQacBrIGnAalBrMGsgalBrMGpQakBqAGtga3BqAGtwasBrYGuAa5BrYGuQa3BrcGuQa6BrcGuga7BqwGtwa7BqwGuwatBokGvAa9BokGvQa+BrwGtAaxBrwGsQa9Br0GsQawBr0GsAa/Br4GvQa/Br4GvwbABroGuQbBBroGwQbCBrkGuAbDBrkGwwbBBsEGwwaNBsEGjQbEBsIGwQbEBsIGxAbFBvQFigbGBvQFxgZpBooGiQa+BooGvgbGBsYGvgbABsYGwAbHBmkGxgbHBmkGxwZqBsUGxAbIBsUGyAbJBsQGjQaLBsQGiwbIBsgGiwb3BcgG9wVtBskGyAZtBskGbQZsBpwFygbLBpwFywaiBcoGtAa8BsoGvAbLBssGvAaJBssGiQaGBqIFywaGBqIFhgakBY0GwwbMBo0GzAaOBsMGuAbNBsMGzQbMBswGzQagBcwGoAWpBY4GzAapBY4GqQWoBZwFgwbOBpwFzgbKBoMGdQbPBoMGzwbOBs4GzwacBs4GnAa1BsoGzga1BsoGtQa0BqAG0AbRBqAG0Qa2BtAGewaFBtAGhQbRBtEGhQagBdEGoAXNBrYG0QbNBrYGzQa4BnUGdAbSBnUG0gbPBnMGnQbSBnMG0gZ0BpwGzwbSBpwG0gadBqAGngbTBqAG0wbQBnYGeQbTBnYG0waeBnsG0AbTBnsG0wZ5BmoGxwbUBmoG1AbVBscGwAbWBscG1gbUBtQG1gbXBtQG1wbYBtUG1AbYBtUG2AbZBtoG2wbcBtoG3AbdBtsGxQbJBtsGyQbcBtwGyQZsBtwGbAbeBt0G3AbeBt0G3gbfBsAGvwbgBsAG4AbWBr8GsAbhBr8G4QbgBuAG4QbiBuAG4gbjBtYG4AbjBtYG4wbXBuQG5QbmBuQG5gbnBuUGugbCBuUGwgbmBuYGwgbFBuYGxQbbBucG5gbbBucG2wbaBrAGswboBrAG6AbhBrMGpAbpBrMG6QboBugG6QbqBugG6gbrBuEG6AbrBuEG6wbiBuwG7QbuBuwG7gbvBu0GrQa7Bu0GuwbuBu4Guwa6Bu4GugblBu8G7gblBu8G5QbkBqQGpwbwBqQG8AbpBqcGqQbxBqcG8QbwBvAG8QbyBvAG8gbzBukG8AbzBukG8wbqBvQG9Qb2BvQG9gb3BvUGrwauBvUGrgb2BvYGrgatBvYGrQbtBvcG9gbtBvcG7QbsBqkGqAb4BqkG+AbxBqgGmAb5BqgG+Qb4BvgG+Qb6BvgG+gb7BvEG+Ab7BvEG+wbyBvwG/Qb+BvwG/gb/Bv0GogarBv0Gqwb+Bv4GqwavBv4Grwb1Bv8G/gb1Bv8G9Qb0BpgGmwYAB5gGAAf5BpsGkgYBB5sGAQcABwAHAQcCBwAHAgcDB/kGAAcDB/kGAwf6BgQHBQcGBwQHBgcHBwUHlAajBgUHowYGBwYHowaiBgYHogb9BgcHBgf9BgcH/Qb8BpIGkQYIB5IGCAcBB5EGQAYJB5EGCQcIBwgHCQcKBwgHCgcLBwEHCAcLBwEHCwcCBwwHDQcOBwwHDgcPBw0HQgaVBg0HlQYOBw4HlQaUBg4HlAYFBw8HDgcFBw8HBQcEB2IGawYQB2IGEAcRB2sGagbVBmsG1QYQBxAH1QbZBhAH2QYSBxEHEAcSBxEHEgcTB98G3gYUB98GFAcVB94GbAZvBt4GbwYUBxQHbwZmBhQHZgYWBxUHFAcWBxUHFgcXB1oGYwYYB1oGGAcZB2MGYgYRB2MGEQcYBxgHEQcTBxgHEwcaBxkHGAcaBxkHGgcbBxcHFgccBxcHHAcdBxYHZgZkBhYHZAYcBxwHZAZeBhwHXgYeBx0HHAceBx0HHgcfB1IGWwYgB1IGIAchB1sGWgYZB1sGGQcgByAHGQcbByAHGwciByEHIAciByEHIgcjBx8HHgckBx8HJAclBx4HXgZcBh4HXAYkByQHXAZWBiQHVgYmByUHJAcmByUHJgcnB0oGUwYoB0oGKAcpB1MGUgYhB1MGIQcoBygHIQcjBygHIwcqBykHKAcqBykHKgcrBycHJgcsBycHLActByYHVgZUBiYHVAYsBywHVAZOBiwHTgYuBy0HLAcuBy0HLgcvBz4GSwYwBz4GMAcxB0sGSgYpB0sGKQcwBzAHKQcrBzAHKwcyBzEHMAcyBzEHMgczBy8HLgc0By8HNAc1By4HTgZMBi4HTAY0BzQHTAZGBjQHRgY2BzUHNAc2BzUHNgc3B0AGPwY4B0AGOAcJBz8GPgYxBz8GMQc4BzgHMQczBzgHMwc5BwkHOAc5BwkHOQcKBzcHNgc6BzcHOgc7BzYHRgZDBjYHQwY6BzoHQwZCBjoHQgYNBzsHOgcNBzsHDQcMB/IG+wY8B/IGPAc9B/sG+gY+B/sGPgc8BzwHPgc/BzwHPwdABz0HPAdABz0HQAdBB0IHQwdEB0IHRAdFB0MH/Ab/BkMH/wZEB0QH/wb0BkQH9AZGB0UHRAdGB0UHRgdHB0EHQAdIB0EHSAdJB0AHPwdKB0AHSgdIB0gHSgdLB0gHSwdMB0kHSAdMB0kHTAdNB04HTwdQB04HUAdRB08HQgdFB08HRQdQB1AHRQdHB1AHRwdSB1EHUAdSB1EHUgdTB00HTAdUB00HVAdVB0wHSwdWB0wHVgdUB1QHVgdXB1QHVwdYB1UHVAdYB1UHWAdZB1oHWwdcB1oHXAddB1sHTgdRB1sHUQdcB1wHUQdTB1wHUwdeB10HXAdeB10HXgdfB1kHWAdgB1kHYAdhB1gHVwdiB1gHYgdgB2AHYgdjB2AHYwdkB2EHYAdkB2EHZAdlB2YHZwdoB2YHaAdpB2cHWgddB2cHXQdoB2gHXQdfB2gHXwdqB2kHaAdqB2kHagdrBxMHEgdsBxMHbAdtBxIH2QZuBxIHbgdsB2wHbgdZB2wHWQdhB20HbAdhB20HYQdlB18HbwdwB18HcAdqB28H3wYVB28HFQdwB3AHFQcXB3AHFwdxB2oHcAdxB2oHcQdrB9cGcgdzB9cGcwfYBnIHTQdVB3IHVQdzB3MHVQdZB3MHWQduB9gGcwduB9gGbgfZBl8HXgd0B18HdAdvB14HUwd1B14HdQd0B3QHdQfaBnQH2gbdBm8HdAfdBm8H3QbfBtcG4wZ2B9cGdgdyB+MG4gZ3B+MGdwd2B3YHdwdBB3YHQQdJB3IHdgdJB3IHSQdNB0cHeAd5B0cHeQdSB3gH5AbnBngH5wZ5B3kH5wbaBnkH2gZ1B1IHeQd1B1IHdQdTB/IGPQd6B/IGegfzBj0HQQd3Bz0Hdwd6B3oHdwfiBnoH4gbrBvMGegfrBvMG6wbqBuQGeAd7B+QGewfvBngHRwdGB3gHRgd7B3sHRgf0BnsH9Ab3Bu8Gewf3Bu8G9wbsBgIHCwd8BwIHfAcDBwsHCgd9BwsHfQd8B3wHfQc/B3wHPwc+BwMHfAc+BwMHPgf6BkIHfgd/B0IHfwdDB34HDAcPB34HDwd/B38HDwcEB38HBAcHB0MHfwcHB0MHBwf8BjMHgAeBBzMHgQc5B4AHSwdKB4AHSgeBB4EHSgc/B4EHPwd9BzkHgQd9BzkHfQcKB0IHTweCB0IHggd+B08HTgeDB08HgweCB4IHgwc3B4IHNwc7B34Hggc7B34HOwcMBysHhAeFBysHhQcyB4QHVwdWB4QHVgeFB4UHVgdLB4UHSweABzIHhQeABzIHgAczB04HWweGB04HhgeDB1sHWgeHB1sHhweGB4YHhwcvB4YHLwc1B4MHhgc1B4MHNQc3ByMHiAeJByMHiQcqB4gHYwdiB4gHYgeJB4kHYgdXB4kHVweEByoHiQeEByoHhAcrB1oHZweKB1oHigeHB2cHZgeLB2cHiweKB4oHiwcnB4oHJwctB4cHigctB4cHLQcvBxsHjAeNBxsHjQciB4wHZQdkB4wHZAeNB40HZAdjB40HYweIByIHjQeIByIHiAcjB2YHaQeOB2YHjgeLB2kHawePB2kHjweOB44HjwcfB44HHwclB4sHjgclB4sHJQcnBxMHbQeQBxMHkAcaB2UHjAeQB2UHkAdtBxsHGgeQBxsHkAeMBx8HjweRBx8HkQcdB2sHcQeRB2sHkQePBxcHHQeRBxcHkQdxBykGMQaSBykGkgeTBzEGNQaUBzEGlAeSB5IHlAeVB5IHlQeWB5MHkgeWB5MHlgeXB5gHmQeaB5gHmgebB5kHOwY6BpkHOgaaB5oHOgYvBpoHLwacB5sHmgecB5sHnAedBx0GJQaeBx0GngefByUGKQaTByUGkweeB54HkweXB54HlwegB58HngegB58HoAehB50HnAeiB50HogejB5wHLwYuBpwHLgaiB6IHLgYjBqIHIwakB6MHogekB6MHpAelBxEGGQamBxEGpgenBxkGHQafBxkGnwemB6YHnwehB6YHoQeoB6cHpgeoB6cHqAepB6UHpAeqB6UHqgerB6QHIwYiBqQHIgaqB6oHIgYXBqoHFwasB6sHqgesB6sHrAetBwUGDQauBwUGrgevBw0GEQanBw0GpweuB64HpwepB64HqQewB68HrgewB68HsAexB60HrAeyB60HsgezB6wHFwYWBqwHFgayB7IHFgYLBrIHCwa0B7MHsge0B7MHtAe1B+4FAQa2B+4Ftge3BwEGBQavBwEGrwe2B7YHrwexB7YHsQe4B7cHtge4B7cHuAe5B7UHtAe6B7UHuge7B7QHCwYKBrQHCga6B7oHCgb9BboH/QW8B7sHuge8B7sHvAe9B/IF7wW+B/IFvge/B+8F7gW3B+8Ftwe+B74Htwe5B74HuQfAB78HvgfAB78HwAfBB70HvAfCB70HwgfDB7wH/QX8BbwH/AXCB8IH/AX7BcIH+wXEB8MHwgfEB8MHxAfFB7kHxgfHB7kHxwfAB8YHlweWB8YHlgfHB8cHlgeVB8cHlQfIB8AHxwfIB8AHyAfBB5gHmwfJB5gHyQfKB5sHnQfLB5sHywfJB8kHywe9B8kHvQfDB8oHyQfDB8oHwwfFB7kHuAfMB7kHzAfGB7gHsQfNB7gHzQfMB8wHzQehB8wHoQegB8YHzAegB8YHoAeXB6UHzgfPB6UHzwejB84HtQe7B84HuwfPB88Huwe9B88HvQfLB6MHzwfLB6MHywedB7EHsAfQB7EH0AfNB6kHqAfQB6kH0AewB6EHzQfQB6EH0AeoB6UHqwfRB6UH0QfOB60HswfRB60H0QerB7UHzgfRB7UH0QezB18FqwXSB18F0gfTB6sFpAWIBqsFiAbSB9IHiAbyBdIH8gW/B9MH0ge/B9MHvwfBB/sFjwbUB/sF1AfEB48GqAWtBY8GrQXUB9QHrQVpBdQHaQXVB8QH1AfVB8QH1QfFB18F0wfWB18F1gfSBdMHwQfIB9MHyAfWB9YHyAeVB9YHlQfXB9IF1gfXB9IF1wfUBZgHygfYB5gH2AfZB8oHxQfVB8oH1QfYB9gH1QdpBdgHaQXdBdkH2AfdBdkH3QXcBb4F4wXaB74F2gd8BuMF1AXXB+MF1wfaB9oH1weVB9oHlQeUB3wG2geUB3wGlAc1BpgH2QfbB5gH2weZB9kH3AXnBdkH5wXbB9sH5wXDBdsHwwWBBpkH2weBBpkHgQY7Bg==" + } + ] +} diff --git a/assets/examples/models/sphere/sphere.bin b/assets/examples/models/sphere/sphere.bin new file mode 100644 index 0000000000..b705998af1 Binary files /dev/null and b/assets/examples/models/sphere/sphere.bin differ diff --git a/assets/examples/models/sphere/sphere.gltf b/assets/examples/models/sphere/sphere.gltf new file mode 100644 index 0000000000..a2a3034d31 --- /dev/null +++ b/assets/examples/models/sphere/sphere.gltf @@ -0,0 +1,100 @@ +{ + "asset" : { + "generator" : "Khronos glTF Blender I/O v1.1.46", + "version" : "2.0" + }, + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 0 + ] + } + ], + "nodes" : [ + { + "mesh" : 0, + "name" : "Sphere" + } + ], + "meshes" : [ + { + "name" : "Sphere", + "primitives" : [ + { + "attributes" : { + "POSITION" : 0, + "NORMAL" : 1, + "TEXCOORD_0" : 2 + }, + "indices" : 3 + } + ] + } + ], + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5126, + "count" : 2143, + "max" : [ + 1.0000005960464478, + 1, + 1.000001072883606 + ], + "min" : [ + -1.000000238418579, + -1, + -1 + ], + "type" : "VEC3" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 2143, + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 2143, + "type" : "VEC2" + }, + { + "bufferView" : 3, + "componentType" : 5123, + "count" : 11904, + "type" : "SCALAR" + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 25716, + "byteOffset" : 0 + }, + { + "buffer" : 0, + "byteLength" : 25716, + "byteOffset" : 25716 + }, + { + "buffer" : 0, + "byteLength" : 17144, + "byteOffset" : 51432 + }, + { + "buffer" : 0, + "byteLength" : 23808, + "byteOffset" : 68576 + } + ], + "buffers" : [ + { + "byteLength" : 92384, + "uri" : "sphere.bin" + } + ] +} diff --git a/assets/examples/models/terrain/Mountains.bin b/assets/examples/models/terrain/Mountains.bin new file mode 100644 index 0000000000..399b8de820 Binary files /dev/null and b/assets/examples/models/terrain/Mountains.bin differ diff --git a/assets/examples/models/terrain/Mountains.gltf b/assets/examples/models/terrain/Mountains.gltf new file mode 100644 index 0000000000..e9a10389b8 --- /dev/null +++ b/assets/examples/models/terrain/Mountains.gltf @@ -0,0 +1,143 @@ +{ + "asset" : { + "generator" : "Khronos glTF Blender I/O v3.3.17", + "version" : "2.0" + }, + "extensionsUsed" : [ + "KHR_materials_specular", + "KHR_materials_ior" + ], + "scene" : 0, + "scenes" : [ + { + "name" : "Scene", + "nodes" : [ + 0, + 1 + ] + } + ], + "nodes" : [ + { + "mesh" : 0, + "name" : "Grid" + }, + { + "mesh" : 0, + "name" : "Grid.001", + "translation" : [ + 0.0018983177142217755, + -2.7217100068810396e-05, + 0.0012765892315655947 + ] + } + ], + "materials" : [ + { + "doubleSided" : true, + "extensions" : { + "KHR_materials_specular" : { + "specularColorFactor" : [ + 0, + 0, + 0 + ] + }, + "KHR_materials_ior" : { + "ior" : 1.4500000476837158 + } + }, + "name" : "Material.001", + "pbrMetallicRoughness" : { + "baseColorFactor" : [ + 0.12338346652686596, + 0.35653680562973022, + 0.065849664583802223, + 1 + ], + "metallicFactor" : 0, + "roughnessFactor" : 0.9980237483978271 + } + } + ], + "meshes" : [ + { + "name" : "Grid", + "primitives" : [ + { + "attributes" : { + "POSITION" : 0, + "NORMAL" : 1, + "TEXCOORD_0" : 2 + }, + "indices" : 3, + "material" : 0 + } + ] + } + ], + "accessors" : [ + { + "bufferView" : 0, + "componentType" : 5126, + "count" : 6561, + "max" : [ + 1.0000003576278687, + 0.2493455857038498, + 1.0051095485687256 + ], + "min" : [ + -1.0000003576278687, + -0.08555418252944946, + -1.0000003576278687 + ], + "type" : "VEC3" + }, + { + "bufferView" : 1, + "componentType" : 5126, + "count" : 6561, + "type" : "VEC3" + }, + { + "bufferView" : 2, + "componentType" : 5126, + "count" : 6561, + "type" : "VEC2" + }, + { + "bufferView" : 3, + "componentType" : 5123, + "count" : 38400, + "type" : "SCALAR" + } + ], + "bufferViews" : [ + { + "buffer" : 0, + "byteLength" : 78732, + "byteOffset" : 0 + }, + { + "buffer" : 0, + "byteLength" : 78732, + "byteOffset" : 78732 + }, + { + "buffer" : 0, + "byteLength" : 52488, + "byteOffset" : 157464 + }, + { + "buffer" : 0, + "byteLength" : 76800, + "byteOffset" : 209952 + } + ], + "buffers" : [ + { + "byteLength" : 286752, + "uri" : "Mountains.bin" + } + ] +} diff --git a/assets/examples/pixel/bevy_pixel_dark.png b/assets/examples/pixel/bevy_pixel_dark.png new file mode 100644 index 0000000000..15feaa9460 Binary files /dev/null and b/assets/examples/pixel/bevy_pixel_dark.png differ diff --git a/assets/examples/pixel/bevy_pixel_light.png b/assets/examples/pixel/bevy_pixel_light.png new file mode 100644 index 0000000000..f6225fe25e Binary files /dev/null and b/assets/examples/pixel/bevy_pixel_light.png differ diff --git a/assets/examples/scenes/load_scene_example.scn.ron b/assets/examples/scenes/load_scene_example.scn.ron new file mode 100644 index 0000000000..4c03d1c53c --- /dev/null +++ b/assets/examples/scenes/load_scene_example.scn.ron @@ -0,0 +1,41 @@ +( + resources: { + "scene::ResourceA": ( + score: 2, + ), + }, + entities: { + 0: ( + components: { + "bevy_transform::components::transform::Transform": ( + translation: ( + x: 0.0, + y: 0.0, + z: 0.0 + ), + rotation: (0.0, 0.0, 0.0, 1.0), + scale: ( + x: 1.0, + y: 1.0, + z: 1.0 + ), + ), + "scene::ComponentB": ( + value: "hello", + ), + "scene::ComponentA": ( + x: 1.0, + y: 2.0, + ), + }, + ), + 1: ( + components: { + "scene::ComponentA": ( + x: 3.0, + y: 4.0, + ), + }, + ), + } +) diff --git a/assets/examples/shaders/animate_shader.wgsl b/assets/examples/shaders/animate_shader.wgsl new file mode 100644 index 0000000000..76112e1477 --- /dev/null +++ b/assets/examples/shaders/animate_shader.wgsl @@ -0,0 +1,43 @@ +// The time since startup data is in the globals binding which is part of the mesh_view_bindings import +#import bevy_pbr::mesh_view_bindings globals +#import bevy_pbr::mesh_vertex_output MeshVertexOutput + +fn oklab_to_linear_srgb(c: vec3) -> vec3 { + let L = c.x; + let a = c.y; + let b = c.z; + + let l_ = L + 0.3963377774 * a + 0.2158037573 * b; + let m_ = L - 0.1055613458 * a - 0.0638541728 * b; + let s_ = L - 0.0894841775 * a - 1.2914855480 * b; + + let l = l_ * l_ * l_; + let m = m_ * m_ * m_; + let s = s_ * s_ * s_; + + return vec3( + 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s, + -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s, + -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s, + ); +} + +@fragment +fn fragment(in: MeshVertexOutput) -> @location(0) vec4 { + let speed = 2.0; + // The globals binding contains various global values like time + // which is the time since startup in seconds + let t_1 = sin(globals.time * speed) * 0.5 + 0.5; + let t_2 = cos(globals.time * speed); + + let distance_to_center = distance(in.uv, vec2(0.5)) * 1.4; + + // blending is done in a perceptual color space: https://bottosson.github.io/posts/oklab/ + let red = vec3(0.627955, 0.224863, 0.125846); + let green = vec3(0.86644, -0.233887, 0.179498); + let blue = vec3(0.701674, 0.274566, -0.169156); + let white = vec3(1.0, 0.0, 0.0); + let mixed = mix(mix(red, blue, t_1), mix(green, white, t_2), distance_to_center); + + return vec4(oklab_to_linear_srgb(mixed), 1.0); +} diff --git a/assets/examples/shaders/array_texture.wgsl b/assets/examples/shaders/array_texture.wgsl new file mode 100644 index 0000000000..4650491724 --- /dev/null +++ b/assets/examples/shaders/array_texture.wgsl @@ -0,0 +1,52 @@ +#import bevy_pbr::mesh_vertex_output MeshVertexOutput +#import bevy_pbr::mesh_view_bindings view +#import bevy_pbr::pbr_types STANDARD_MATERIAL_FLAGS_DOUBLE_SIDED_BIT +#import bevy_core_pipeline::tonemapping tone_mapping +#import bevy_pbr::pbr_functions as fns + +@group(1) @binding(0) +var my_array_texture: texture_2d_array; +@group(1) @binding(1) +var my_array_texture_sampler: sampler; + +@fragment +fn fragment( + @builtin(front_facing) is_front: bool, + mesh: MeshVertexOutput, +) -> @location(0) vec4 { + let layer = i32(mesh.world_position.x) & 0x3; + + // Prepare a 'processed' StandardMaterial by sampling all textures to resolve + // the material members + var pbr_input: fns::PbrInput = fns::pbr_input_new(); + + pbr_input.material.base_color = textureSample(my_array_texture, my_array_texture_sampler, mesh.uv, layer); +#ifdef VERTEX_COLORS + pbr_input.material.base_color = pbr_input.material.base_color * mesh.color; +#endif + + pbr_input.frag_coord = mesh.position; + pbr_input.world_position = mesh.world_position; + pbr_input.world_normal = fns::prepare_world_normal( + mesh.world_normal, + (pbr_input.material.flags & STANDARD_MATERIAL_FLAGS_DOUBLE_SIDED_BIT) != 0u, + is_front, + ); + + pbr_input.is_orthographic = view.projection[3].w == 1.0; + + pbr_input.N = fns::apply_normal_mapping( + pbr_input.material.flags, + mesh.world_normal, +#ifdef VERTEX_TANGENTS +#ifdef STANDARDMATERIAL_NORMAL_MAP + mesh.world_tangent, +#endif +#endif + mesh.uv, + view.mip_bias, + ); + pbr_input.V = fns::calculate_view(mesh.world_position, pbr_input.is_orthographic); + + return tone_mapping(fns::pbr(pbr_input), view.color_grading); +} diff --git a/assets/examples/shaders/cubemap_unlit.wgsl b/assets/examples/shaders/cubemap_unlit.wgsl new file mode 100644 index 0000000000..b0c3672848 --- /dev/null +++ b/assets/examples/shaders/cubemap_unlit.wgsl @@ -0,0 +1,24 @@ +#import bevy_pbr::mesh_vertex_output MeshVertexOutput + +#ifdef CUBEMAP_ARRAY +@group(1) @binding(0) +var base_color_texture: texture_cube_array; +#else +@group(1) @binding(0) +var base_color_texture: texture_cube; +#endif + +@group(1) @binding(1) +var base_color_sampler: sampler; + +@fragment +fn fragment( + mesh: MeshVertexOutput, +) -> @location(0) vec4 { + let fragment_position_view_lh = mesh.world_position.xyz * vec3(1.0, 1.0, -1.0); + return textureSample( + base_color_texture, + base_color_sampler, + fragment_position_view_lh + ); +} diff --git a/assets/examples/shaders/custom_gltf_2d.wgsl b/assets/examples/shaders/custom_gltf_2d.wgsl new file mode 100644 index 0000000000..58058d9501 --- /dev/null +++ b/assets/examples/shaders/custom_gltf_2d.wgsl @@ -0,0 +1,36 @@ +#import bevy_sprite::mesh2d_view_bindings globals +#import bevy_sprite::mesh2d_bindings mesh +#import bevy_sprite::mesh2d_functions mesh2d_position_local_to_clip + +struct Vertex { + @location(0) position: vec3, + @location(1) color: vec4, + @location(2) barycentric: vec3, +}; + +struct VertexOutput { + @builtin(position) clip_position: vec4, + @location(0) color: vec4, + @location(1) barycentric: vec3, +}; + +@vertex +fn vertex(vertex: Vertex) -> VertexOutput { + var out: VertexOutput; + out.clip_position = mesh2d_position_local_to_clip(mesh.model, vec4(vertex.position, 1.0)); + out.color = vertex.color; + out.barycentric = vertex.barycentric; + return out; +} + +struct FragmentInput { + @location(0) color: vec4, + @location(1) barycentric: vec3, +}; + +@fragment +fn fragment(input: FragmentInput) -> @location(0) vec4 { + let d = min(input.barycentric.x, min(input.barycentric.y, input.barycentric.z)); + let t = 0.05 * (0.85 + sin(5.0 * globals.time)); + return mix(vec4(1.0,1.0,1.0,1.0), input.color, smoothstep(t, t+0.01, d)); +} diff --git a/assets/examples/shaders/custom_material.frag b/assets/examples/shaders/custom_material.frag new file mode 100644 index 0000000000..04b644fda8 --- /dev/null +++ b/assets/examples/shaders/custom_material.frag @@ -0,0 +1,20 @@ +#version 450 +layout(location = 0) in vec2 v_Uv; + +layout(location = 0) out vec4 o_Target; + +layout(set = 1, binding = 0) uniform CustomMaterial { + vec4 Color; +}; + +layout(set = 1, binding = 1) uniform texture2D CustomMaterial_texture; +layout(set = 1, binding = 2) uniform sampler CustomMaterial_sampler; + +// wgsl modules can be imported and used in glsl +// FIXME - this doesn't work any more ... +// #import bevy_pbr::pbr_functions as PbrFuncs + +void main() { + // o_Target = PbrFuncs::tone_mapping(Color * texture(sampler2D(CustomMaterial_texture,CustomMaterial_sampler), v_Uv)); + o_Target = Color * texture(sampler2D(CustomMaterial_texture,CustomMaterial_sampler), v_Uv); +} diff --git a/assets/examples/shaders/custom_material.vert b/assets/examples/shaders/custom_material.vert new file mode 100644 index 0000000000..59af5305ba --- /dev/null +++ b/assets/examples/shaders/custom_material.vert @@ -0,0 +1,28 @@ +#version 450 + +layout(location = 0) in vec3 Vertex_Position; +layout(location = 1) in vec3 Vertex_Normal; +layout(location = 2) in vec2 Vertex_Uv; + +layout(location = 0) out vec2 v_Uv; + +layout(set = 0, binding = 0) uniform CameraViewProj { + mat4 ViewProj; + mat4 View; + mat4 InverseView; + mat4 Projection; + vec3 WorldPosition; + float width; + float height; +}; + +layout(set = 2, binding = 0) uniform Mesh { + mat4 Model; + mat4 InverseTransposeModel; + uint flags; +}; + +void main() { + v_Uv = Vertex_Uv; + gl_Position = ViewProj * Model * vec4(Vertex_Position, 1.0); +} diff --git a/assets/examples/shaders/custom_material.wgsl b/assets/examples/shaders/custom_material.wgsl new file mode 100644 index 0000000000..d09f5b4e3d --- /dev/null +++ b/assets/examples/shaders/custom_material.wgsl @@ -0,0 +1,19 @@ +#import bevy_pbr::mesh_vertex_output MeshVertexOutput + +struct CustomMaterial { + color: vec4, +}; + +@group(1) @binding(0) +var material: CustomMaterial; +@group(1) @binding(1) +var base_color_texture: texture_2d; +@group(1) @binding(2) +var base_color_sampler: sampler; + +@fragment +fn fragment( + mesh: MeshVertexOutput, +) -> @location(0) vec4 { + return material.color * textureSample(base_color_texture, base_color_sampler, mesh.uv); +} diff --git a/assets/examples/shaders/custom_material_screenspace_texture.wgsl b/assets/examples/shaders/custom_material_screenspace_texture.wgsl new file mode 100644 index 0000000000..99c100d15e --- /dev/null +++ b/assets/examples/shaders/custom_material_screenspace_texture.wgsl @@ -0,0 +1,17 @@ +#import bevy_pbr::mesh_view_bindings view +#import bevy_pbr::mesh_vertex_output MeshVertexOutput +#import bevy_pbr::utils coords_to_viewport_uv + +@group(1) @binding(0) +var texture: texture_2d; +@group(1) @binding(1) +var texture_sampler: sampler; + +@fragment +fn fragment( + mesh: MeshVertexOutput, +) -> @location(0) vec4 { + let viewport_uv = coords_to_viewport_uv(mesh.position.xy, view.viewport); + let color = textureSample(texture, texture_sampler, viewport_uv); + return color; +} diff --git a/assets/examples/shaders/custom_vertex_attribute.wgsl b/assets/examples/shaders/custom_vertex_attribute.wgsl new file mode 100644 index 0000000000..2d1307bc7e --- /dev/null +++ b/assets/examples/shaders/custom_vertex_attribute.wgsl @@ -0,0 +1,38 @@ +#import bevy_pbr::mesh_bindings mesh +#import bevy_pbr::mesh_functions mesh_position_local_to_clip + +struct CustomMaterial { + color: vec4, +}; +@group(1) @binding(0) +var material: CustomMaterial; + +struct Vertex { + @location(0) position: vec3, + @location(1) blend_color: vec4, +}; + +struct VertexOutput { + @builtin(position) clip_position: vec4, + @location(0) blend_color: vec4, +}; + +@vertex +fn vertex(vertex: Vertex) -> VertexOutput { + var out: VertexOutput; + out.clip_position = mesh_position_local_to_clip( + mesh.model, + vec4(vertex.position, 1.0) + ); + out.blend_color = vertex.blend_color; + return out; +} + +struct FragmentInput { + @location(0) blend_color: vec4, +}; + +@fragment +fn fragment(input: FragmentInput) -> @location(0) vec4 { + return material.color * input.blend_color; +} diff --git a/assets/examples/shaders/fallback_image_test.wgsl b/assets/examples/shaders/fallback_image_test.wgsl new file mode 100644 index 0000000000..5bad13f899 --- /dev/null +++ b/assets/examples/shaders/fallback_image_test.wgsl @@ -0,0 +1,36 @@ +#import bevy_pbr::mesh_view_bindings +#import bevy_pbr::mesh_bindings +#import bevy_pbr::mesh_vertex_output MeshVertexOutput + +@group(1) @binding(0) +var test_texture_1d: texture_1d; +@group(1) @binding(1) +var test_texture_1d_sampler: sampler; + +@group(1) @binding(2) +var test_texture_2d: texture_2d; +@group(1) @binding(3) +var test_texture_2d_sampler: sampler; + +@group(1) @binding(4) +var test_texture_2d_array: texture_2d_array; +@group(1) @binding(5) +var test_texture_2d_array_sampler: sampler; + +@group(1) @binding(6) +var test_texture_cube: texture_cube; +@group(1) @binding(7) +var test_texture_cube_sampler: sampler; + +@group(1) @binding(8) +var test_texture_cube_array: texture_cube_array; +@group(1) @binding(9) +var test_texture_cube_array_sampler: sampler; + +@group(1) @binding(10) +var test_texture_3d: texture_3d; +@group(1) @binding(11) +var test_texture_3d_sampler: sampler; + +@fragment +fn fragment(in: MeshVertexOutput) {} diff --git a/assets/examples/shaders/game_of_life.wgsl b/assets/examples/shaders/game_of_life.wgsl new file mode 100644 index 0000000000..8858b20751 --- /dev/null +++ b/assets/examples/shaders/game_of_life.wgsl @@ -0,0 +1,66 @@ +@group(0) @binding(0) +var texture: texture_storage_2d; + +fn hash(value: u32) -> u32 { + var state = value; + state = state ^ 2747636419u; + state = state * 2654435769u; + state = state ^ state >> 16u; + state = state * 2654435769u; + state = state ^ state >> 16u; + state = state * 2654435769u; + return state; +} + +fn randomFloat(value: u32) -> f32 { + return f32(hash(value)) / 4294967295.0; +} + +@compute @workgroup_size(8, 8, 1) +fn init(@builtin(global_invocation_id) invocation_id: vec3, @builtin(num_workgroups) num_workgroups: vec3) { + let location = vec2(i32(invocation_id.x), i32(invocation_id.y)); + + let randomNumber = randomFloat(invocation_id.y * num_workgroups.x + invocation_id.x); + let alive = randomNumber > 0.9; + let color = vec4(f32(alive)); + + textureStore(texture, location, color); +} + +fn is_alive(location: vec2, offset_x: i32, offset_y: i32) -> i32 { + let value: vec4 = textureLoad(texture, location + vec2(offset_x, offset_y)); + return i32(value.x); +} + +fn count_alive(location: vec2) -> i32 { + return is_alive(location, -1, -1) + + is_alive(location, -1, 0) + + is_alive(location, -1, 1) + + is_alive(location, 0, -1) + + is_alive(location, 0, 1) + + is_alive(location, 1, -1) + + is_alive(location, 1, 0) + + is_alive(location, 1, 1); +} + +@compute @workgroup_size(8, 8, 1) +fn update(@builtin(global_invocation_id) invocation_id: vec3) { + let location = vec2(i32(invocation_id.x), i32(invocation_id.y)); + + let n_alive = count_alive(location); + + var alive: bool; + if (n_alive == 3) { + alive = true; + } else if (n_alive == 2) { + let currently_alive = is_alive(location, 0, 0); + alive = bool(currently_alive); + } else { + alive = false; + } + let color = vec4(f32(alive)); + + storageBarrier(); + + textureStore(texture, location, color); +} \ No newline at end of file diff --git a/assets/examples/shaders/instancing.wgsl b/assets/examples/shaders/instancing.wgsl new file mode 100644 index 0000000000..cf41bb0131 --- /dev/null +++ b/assets/examples/shaders/instancing.wgsl @@ -0,0 +1,33 @@ +#import bevy_pbr::mesh_functions mesh_position_local_to_clip +#import bevy_pbr::mesh_bindings mesh + +struct Vertex { + @location(0) position: vec3, + @location(1) normal: vec3, + @location(2) uv: vec2, + + @location(3) i_pos_scale: vec4, + @location(4) i_color: vec4, +}; + +struct VertexOutput { + @builtin(position) clip_position: vec4, + @location(0) color: vec4, +}; + +@vertex +fn vertex(vertex: Vertex) -> VertexOutput { + let position = vertex.position * vertex.i_pos_scale.w + vertex.i_pos_scale.xyz; + var out: VertexOutput; + out.clip_position = mesh_position_local_to_clip( + mesh.model, + vec4(position, 1.0) + ); + out.color = vertex.i_color; + return out; +} + +@fragment +fn fragment(in: VertexOutput) -> @location(0) vec4 { + return in.color; +} diff --git a/assets/examples/shaders/line_material.wgsl b/assets/examples/shaders/line_material.wgsl new file mode 100644 index 0000000000..dcf4cac57a --- /dev/null +++ b/assets/examples/shaders/line_material.wgsl @@ -0,0 +1,15 @@ +#import bevy_pbr::mesh_vertex_output MeshVertexOutput + +struct LineMaterial { + color: vec4, +}; + +@group(1) @binding(0) +var material: LineMaterial; + +@fragment +fn fragment( + mesh: MeshVertexOutput, +) -> @location(0) vec4 { + return material.color; +} diff --git a/assets/examples/shaders/post_processing.wgsl b/assets/examples/shaders/post_processing.wgsl new file mode 100644 index 0000000000..4b1fed2aa2 --- /dev/null +++ b/assets/examples/shaders/post_processing.wgsl @@ -0,0 +1,52 @@ +// This shader computes the chromatic aberration effect + +#import bevy_pbr::utils + +// Since post processing is a fullscreen effect, we use the fullscreen vertex shader provided by bevy. +// This will import a vertex shader that renders a single fullscreen triangle. +// +// A fullscreen triangle is a single triangle that covers the entire screen. +// The box in the top left in that diagram is the screen. The 4 x are the corner of the screen +// +// Y axis +// 1 | x-----x...... +// 0 | | s | . ´ +// -1 | x_____x´ +// -2 | : .´ +// -3 | :´ +// +--------------- X axis +// -1 0 1 2 3 +// +// As you can see, the triangle ends up bigger than the screen. +// +// You don't need to worry about this too much since bevy will compute the correct UVs for you. +#import bevy_core_pipeline::fullscreen_vertex_shader FullscreenVertexOutput + +@group(0) @binding(0) +var screen_texture: texture_2d; +@group(0) @binding(1) +var texture_sampler: sampler; +struct PostProcessSettings { + intensity: f32, +#ifdef SIXTEEN_BYTE_ALIGNMENT + // WebGL2 structs must be 16 byte aligned. + _webgl2_padding: vec3 +#endif +} +@group(0) @binding(2) +var settings: PostProcessSettings; + +@fragment +fn fragment(in: FullscreenVertexOutput) -> @location(0) vec4 { + // Chromatic aberration strength + let offset_strength = settings.intensity; + + // Sample each color channel with an arbitrary shift + return vec4( + textureSample(screen_texture, texture_sampler, in.uv + vec2(offset_strength, -offset_strength)).r, + textureSample(screen_texture, texture_sampler, in.uv + vec2(-offset_strength, 0.0)).g, + textureSample(screen_texture, texture_sampler, in.uv + vec2(0.0, offset_strength)).b, + 1.0 + ); +} + diff --git a/assets/examples/shaders/shader_defs.wgsl b/assets/examples/shaders/shader_defs.wgsl new file mode 100644 index 0000000000..fae9de396d --- /dev/null +++ b/assets/examples/shaders/shader_defs.wgsl @@ -0,0 +1,19 @@ +#import bevy_pbr::mesh_vertex_output MeshVertexOutput + +struct CustomMaterial { + color: vec4, +}; + +@group(1) @binding(0) +var material: CustomMaterial; + +@fragment +fn fragment( + mesh: MeshVertexOutput, +) -> @location(0) vec4 { +#ifdef IS_RED + return vec4(1.0, 0.0, 0.0, 1.0); +#else + return material.color; +#endif +} diff --git a/assets/examples/shaders/show_prepass.wgsl b/assets/examples/shaders/show_prepass.wgsl new file mode 100644 index 0000000000..bd5abf401b --- /dev/null +++ b/assets/examples/shaders/show_prepass.wgsl @@ -0,0 +1,38 @@ +#import bevy_pbr::mesh_types +#import bevy_pbr::mesh_view_bindings globals +#import bevy_pbr::prepass_utils +#import bevy_pbr::mesh_vertex_output MeshVertexOutput + +struct ShowPrepassSettings { + show_depth: u32, + show_normals: u32, + show_motion_vectors: u32, + padding_1: u32, + padding_2: u32, +} +@group(1) @binding(0) +var settings: ShowPrepassSettings; + +@fragment +fn fragment( +#ifdef MULTISAMPLED + @builtin(sample_index) sample_index: u32, +#endif + mesh: MeshVertexOutput, +) -> @location(0) vec4 { +#ifndef MULTISAMPLED + let sample_index = 0u; +#endif + if settings.show_depth == 1u { + let depth = bevy_pbr::prepass_utils::prepass_depth(mesh.position, sample_index); + return vec4(depth, depth, depth, 1.0); + } else if settings.show_normals == 1u { + let normal = bevy_pbr::prepass_utils::prepass_normal(mesh.position, sample_index); + return vec4(normal, 1.0); + } else if settings.show_motion_vectors == 1u { + let motion_vector = bevy_pbr::prepass_utils::prepass_motion_vector(mesh.position, sample_index); + return vec4(motion_vector / globals.delta_time, 0.0, 1.0); + } + + return vec4(0.0); +} diff --git a/assets/examples/shaders/texture_binding_array.wgsl b/assets/examples/shaders/texture_binding_array.wgsl new file mode 100644 index 0000000000..a88b8bcf22 --- /dev/null +++ b/assets/examples/shaders/texture_binding_array.wgsl @@ -0,0 +1,19 @@ +#import bevy_pbr::mesh_vertex_output MeshVertexOutput + +@group(1) @binding(0) +var textures: binding_array>; +@group(1) @binding(1) +var nearest_sampler: sampler; +// We can also have array of samplers +// var samplers: binding_array; + +@fragment +fn fragment( + mesh: MeshVertexOutput, +) -> @location(0) vec4 { + // Select the texture to sample from using non-uniform uv coordinates + let coords = clamp(vec2(mesh.uv * 4.0), vec2(0u), vec2(3u)); + let index = coords.y * 4u + coords.x; + let inner_uv = fract(mesh.uv * 4.0); + return textureSample(textures[index], nearest_sampler, inner_uv); +} diff --git a/assets/examples/shaders/tonemapping_test_patterns.wgsl b/assets/examples/shaders/tonemapping_test_patterns.wgsl new file mode 100644 index 0000000000..18573981d8 --- /dev/null +++ b/assets/examples/shaders/tonemapping_test_patterns.wgsl @@ -0,0 +1,61 @@ +#import bevy_pbr::mesh_view_bindings +#import bevy_pbr::mesh_bindings +#import bevy_pbr::mesh_vertex_output MeshVertexOutput +#import bevy_pbr::utils PI + +#ifdef TONEMAP_IN_SHADER +#import bevy_core_pipeline::tonemapping +#endif + +// Sweep across hues on y axis with value from 0.0 to +15EV across x axis +// quantized into 24 steps for both axis. +fn color_sweep(uv: vec2) -> vec3 { + var uv = uv; + let steps = 24.0; + uv.y = uv.y * (1.0 + 1.0 / steps); + let ratio = 2.0; + + let h = PI * 2.0 * floor(1.0 + steps * uv.y) / steps; + let L = floor(uv.x * steps * ratio) / (steps * ratio) - 0.5; + + var color = vec3(0.0); + if uv.y < 1.0 { + color = cos(h + vec3(0.0, 1.0, 2.0) * PI * 2.0 / 3.0); + let maxRGB = max(color.r, max(color.g, color.b)); + let minRGB = min(color.r, min(color.g, color.b)); + color = exp(15.0 * L) * (color - minRGB) / (maxRGB - minRGB); + } else { + color = vec3(exp(15.0 * L)); + } + return color; +} + +fn hsv_to_srgb(c: vec3) -> vec3 { + let K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + let p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, vec3(0.0), vec3(1.0)), c.y); +} + +// Generates a continuous sRGB sweep. +fn continuous_hue(uv: vec2) -> vec3 { + return hsv_to_srgb(vec3(uv.x, 1.0, 1.0)) * max(0.0, exp2(uv.y * 9.0) - 1.0); +} + +@fragment +fn fragment( + in: MeshVertexOutput, +) -> @location(0) vec4 { + var uv = in.uv; + var out = vec3(0.0); + if uv.y > 0.5 { + uv.y = 1.0 - uv.y; + out = color_sweep(vec2(uv.x, uv.y * 2.0)); + } else { + out = continuous_hue(vec2(uv.y * 2.0, uv.x)); + } + var color = vec4(out, 1.0); +#ifdef TONEMAP_IN_SHADER + color = tone_mapping(color, bevy_pbr::mesh_view_bindings::view.color_grading); +#endif + return color; +} diff --git a/assets/examples/sounds/Windless Slopes.ogg b/assets/examples/sounds/Windless Slopes.ogg new file mode 100644 index 0000000000..8791086367 Binary files /dev/null and b/assets/examples/sounds/Windless Slopes.ogg differ diff --git a/assets/examples/sounds/breakout_collision.ogg b/assets/examples/sounds/breakout_collision.ogg new file mode 100644 index 0000000000..0211d70cfb Binary files /dev/null and b/assets/examples/sounds/breakout_collision.ogg differ diff --git a/assets/examples/textures/Game Icons/exitRight.png b/assets/examples/textures/Game Icons/exitRight.png new file mode 100644 index 0000000000..de78ab6f0f Binary files /dev/null and b/assets/examples/textures/Game Icons/exitRight.png differ diff --git a/assets/examples/textures/Game Icons/right.png b/assets/examples/textures/Game Icons/right.png new file mode 100644 index 0000000000..3f2480f9a5 Binary files /dev/null and b/assets/examples/textures/Game Icons/right.png differ diff --git a/assets/examples/textures/Game Icons/wrench.png b/assets/examples/textures/Game Icons/wrench.png new file mode 100644 index 0000000000..440e7edc41 Binary files /dev/null and b/assets/examples/textures/Game Icons/wrench.png differ diff --git a/assets/examples/textures/Ryfjallet_cubemap.png b/assets/examples/textures/Ryfjallet_cubemap.png new file mode 100644 index 0000000000..777987b755 Binary files /dev/null and b/assets/examples/textures/Ryfjallet_cubemap.png differ diff --git a/assets/examples/textures/Ryfjallet_cubemap_astc4x4.ktx2 b/assets/examples/textures/Ryfjallet_cubemap_astc4x4.ktx2 new file mode 100644 index 0000000000..78696cadca Binary files /dev/null and b/assets/examples/textures/Ryfjallet_cubemap_astc4x4.ktx2 differ diff --git a/assets/examples/textures/Ryfjallet_cubemap_bc7.ktx2 b/assets/examples/textures/Ryfjallet_cubemap_bc7.ktx2 new file mode 100644 index 0000000000..17e67c7c9f Binary files /dev/null and b/assets/examples/textures/Ryfjallet_cubemap_bc7.ktx2 differ diff --git a/assets/examples/textures/Ryfjallet_cubemap_etc2.ktx2 b/assets/examples/textures/Ryfjallet_cubemap_etc2.ktx2 new file mode 100644 index 0000000000..22a389cfd9 Binary files /dev/null and b/assets/examples/textures/Ryfjallet_cubemap_etc2.ktx2 differ diff --git a/assets/examples/textures/Ryfjallet_cubemap_readme.txt b/assets/examples/textures/Ryfjallet_cubemap_readme.txt new file mode 100644 index 0000000000..81bed0d91d --- /dev/null +++ b/assets/examples/textures/Ryfjallet_cubemap_readme.txt @@ -0,0 +1,21 @@ +Modifications +============= + +The original work, as attributed below, has been modified as follows using the ImageMagick tool: + +mogrify -resize 256x256 -format png *.jpg +convert posx.png negx.png posy.png negy.png posz.png negz.png -gravity center -append cubemap.png + +Author +====== + +This is the work of Emil Persson, aka Humus. +http://www.humus.name + + + +License +======= + +This work is licensed under a Creative Commons Attribution 3.0 Unported License. +http://creativecommons.org/licenses/by/3.0/ diff --git a/assets/examples/textures/array_texture.png b/assets/examples/textures/array_texture.png new file mode 100644 index 0000000000..ab2c144e11 Binary files /dev/null and b/assets/examples/textures/array_texture.png differ diff --git a/assets/examples/textures/parallax_example/cube_color.png b/assets/examples/textures/parallax_example/cube_color.png new file mode 100644 index 0000000000..0eefbadc64 Binary files /dev/null and b/assets/examples/textures/parallax_example/cube_color.png differ diff --git a/assets/examples/textures/parallax_example/cube_depth.png b/assets/examples/textures/parallax_example/cube_depth.png new file mode 100644 index 0000000000..4c2c354f09 Binary files /dev/null and b/assets/examples/textures/parallax_example/cube_depth.png differ diff --git a/assets/examples/textures/parallax_example/cube_normal.png b/assets/examples/textures/parallax_example/cube_normal.png new file mode 100644 index 0000000000..9b089bdb02 Binary files /dev/null and b/assets/examples/textures/parallax_example/cube_normal.png differ diff --git a/assets/examples/textures/rpg/chars/gabe/gabe-idle-run.png b/assets/examples/textures/rpg/chars/gabe/gabe-idle-run.png new file mode 100644 index 0000000000..c8f57e34cf Binary files /dev/null and b/assets/examples/textures/rpg/chars/gabe/gabe-idle-run.png differ diff --git a/assets/examples/textures/rpg/chars/hat-guy/hat-guy.png b/assets/examples/textures/rpg/chars/hat-guy/hat-guy.png new file mode 100644 index 0000000000..8ccaee928e Binary files /dev/null and b/assets/examples/textures/rpg/chars/hat-guy/hat-guy.png differ diff --git a/assets/examples/textures/rpg/chars/mani/mani-idle-run.png b/assets/examples/textures/rpg/chars/mani/mani-idle-run.png new file mode 100644 index 0000000000..30f45f0525 Binary files /dev/null and b/assets/examples/textures/rpg/chars/mani/mani-idle-run.png differ diff --git a/assets/examples/textures/rpg/chars/sensei/sensei.png b/assets/examples/textures/rpg/chars/sensei/sensei.png new file mode 100644 index 0000000000..18ac1809f0 Binary files /dev/null and b/assets/examples/textures/rpg/chars/sensei/sensei.png differ diff --git a/assets/examples/textures/rpg/chars/vendor/generic-rpg-vendor.png b/assets/examples/textures/rpg/chars/vendor/generic-rpg-vendor.png new file mode 100644 index 0000000000..8953346538 Binary files /dev/null and b/assets/examples/textures/rpg/chars/vendor/generic-rpg-vendor.png differ diff --git a/assets/examples/textures/rpg/mobs/boss_bee.png b/assets/examples/textures/rpg/mobs/boss_bee.png new file mode 100644 index 0000000000..1971387a2a Binary files /dev/null and b/assets/examples/textures/rpg/mobs/boss_bee.png differ diff --git a/assets/examples/textures/rpg/mobs/fox-run.png b/assets/examples/textures/rpg/mobs/fox-run.png new file mode 100644 index 0000000000..822f0c73dd Binary files /dev/null and b/assets/examples/textures/rpg/mobs/fox-run.png differ diff --git a/assets/examples/textures/rpg/mobs/kobold-idle.png b/assets/examples/textures/rpg/mobs/kobold-idle.png new file mode 100644 index 0000000000..516018d9e0 Binary files /dev/null and b/assets/examples/textures/rpg/mobs/kobold-idle.png differ diff --git a/assets/examples/textures/rpg/mobs/slime-blue.png b/assets/examples/textures/rpg/mobs/slime-blue.png new file mode 100644 index 0000000000..f2d3d4423f Binary files /dev/null and b/assets/examples/textures/rpg/mobs/slime-blue.png differ diff --git a/assets/examples/textures/rpg/mobs/slime-green.png b/assets/examples/textures/rpg/mobs/slime-green.png new file mode 100644 index 0000000000..919af57148 Binary files /dev/null and b/assets/examples/textures/rpg/mobs/slime-green.png differ diff --git a/assets/examples/textures/rpg/mobs/slime-orange.png b/assets/examples/textures/rpg/mobs/slime-orange.png new file mode 100644 index 0000000000..a897ba1a85 Binary files /dev/null and b/assets/examples/textures/rpg/mobs/slime-orange.png differ diff --git a/assets/examples/textures/rpg/mobs/worm-run-idle.png b/assets/examples/textures/rpg/mobs/worm-run-idle.png new file mode 100644 index 0000000000..37783159d6 Binary files /dev/null and b/assets/examples/textures/rpg/mobs/worm-run-idle.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-barrel01.png b/assets/examples/textures/rpg/props/generic-rpg-barrel01.png new file mode 100644 index 0000000000..6a56a788c3 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-barrel01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-barrel02.png b/assets/examples/textures/rpg/props/generic-rpg-barrel02.png new file mode 100644 index 0000000000..8d7317cd53 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-barrel02.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-barrel03.png b/assets/examples/textures/rpg/props/generic-rpg-barrel03.png new file mode 100644 index 0000000000..0d25801629 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-barrel03.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-board01.png b/assets/examples/textures/rpg/props/generic-rpg-board01.png new file mode 100644 index 0000000000..2abb8fb338 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-board01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-board02.png b/assets/examples/textures/rpg/props/generic-rpg-board02.png new file mode 100644 index 0000000000..aaf1cfa9ed Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-board02.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-board03.png b/assets/examples/textures/rpg/props/generic-rpg-board03.png new file mode 100644 index 0000000000..6a46853702 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-board03.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-board04.png b/assets/examples/textures/rpg/props/generic-rpg-board04.png new file mode 100644 index 0000000000..1edbc13d2d Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-board04.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-bridge.png b/assets/examples/textures/rpg/props/generic-rpg-bridge.png new file mode 100644 index 0000000000..a9756774b8 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-bridge.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-crate01.png b/assets/examples/textures/rpg/props/generic-rpg-crate01.png new file mode 100644 index 0000000000..9980613d04 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-crate01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-crate02.png b/assets/examples/textures/rpg/props/generic-rpg-crate02.png new file mode 100644 index 0000000000..af1ca4cf8f Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-crate02.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-crate03.png b/assets/examples/textures/rpg/props/generic-rpg-crate03.png new file mode 100644 index 0000000000..1670c61166 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-crate03.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-complete.png b/assets/examples/textures/rpg/props/generic-rpg-fence-complete.png new file mode 100644 index 0000000000..b51f50a7c8 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-complete.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw01.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw01.png new file mode 100644 index 0000000000..df77e2e7c8 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw02.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw02.png new file mode 100644 index 0000000000..23e1e584e0 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw02.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw03.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw03.png new file mode 100644 index 0000000000..b8bb8d37ec Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw03.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw04.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw04.png new file mode 100644 index 0000000000..40067176ea Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw04.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw05.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw05.png new file mode 100644 index 0000000000..464e659bf6 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw05.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw06.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw06.png new file mode 100644 index 0000000000..f6e9deb7b7 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw06.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw07.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw07.png new file mode 100644 index 0000000000..524ac91b78 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw07.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw08.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw08.png new file mode 100644 index 0000000000..5521d89e6c Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw08.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw09.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw09.png new file mode 100644 index 0000000000..444353ee27 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw09.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw10.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw10.png new file mode 100644 index 0000000000..4c7d37ef4e Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw10.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw11.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw11.png new file mode 100644 index 0000000000..f66d54c0b7 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw11.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw12.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw12.png new file mode 100644 index 0000000000..dbf962e9df Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw12.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw13.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw13.png new file mode 100644 index 0000000000..ed53feeda8 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw13.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw14.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw14.png new file mode 100644 index 0000000000..ef14b1cf64 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw14.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw15.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw15.png new file mode 100644 index 0000000000..48306b30f8 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw15.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw16.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw16.png new file mode 100644 index 0000000000..f039c9877e Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw16.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw17.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw17.png new file mode 100644 index 0000000000..21b2079e89 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw17.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw18.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw18.png new file mode 100644 index 0000000000..434ccb7e12 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw18.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw19.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw19.png new file mode 100644 index 0000000000..2bb913e39c Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw19.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw20.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw20.png new file mode 100644 index 0000000000..2205296b85 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw20.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw21.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw21.png new file mode 100644 index 0000000000..223f358a48 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw21.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw22.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw22.png new file mode 100644 index 0000000000..c137ab8042 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw22.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw23.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw23.png new file mode 100644 index 0000000000..8f69161186 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw23.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw24.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw24.png new file mode 100644 index 0000000000..8f2286f0e6 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw24.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence-raw25.png b/assets/examples/textures/rpg/props/generic-rpg-fence-raw25.png new file mode 100644 index 0000000000..32b1813fa5 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence-raw25.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence01.png b/assets/examples/textures/rpg/props/generic-rpg-fence01.png new file mode 100644 index 0000000000..34e11a6b45 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence02.png b/assets/examples/textures/rpg/props/generic-rpg-fence02.png new file mode 100644 index 0000000000..66e1c204ca Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence02.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence03.png b/assets/examples/textures/rpg/props/generic-rpg-fence03.png new file mode 100644 index 0000000000..d41b816abc Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence03.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence04.png b/assets/examples/textures/rpg/props/generic-rpg-fence04.png new file mode 100644 index 0000000000..d1374f8ecb Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence04.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence05.png b/assets/examples/textures/rpg/props/generic-rpg-fence05.png new file mode 100644 index 0000000000..8baa1857da Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence05.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence06.png b/assets/examples/textures/rpg/props/generic-rpg-fence06.png new file mode 100644 index 0000000000..c70a71b1e7 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence06.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence07.png b/assets/examples/textures/rpg/props/generic-rpg-fence07.png new file mode 100644 index 0000000000..4c5fe0f1d7 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence07.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence08.png b/assets/examples/textures/rpg/props/generic-rpg-fence08.png new file mode 100644 index 0000000000..0e46720a14 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence08.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence09.png b/assets/examples/textures/rpg/props/generic-rpg-fence09.png new file mode 100644 index 0000000000..189e4a52c6 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence09.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence10.png b/assets/examples/textures/rpg/props/generic-rpg-fence10.png new file mode 100644 index 0000000000..2645e20cdc Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence10.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence11.png b/assets/examples/textures/rpg/props/generic-rpg-fence11.png new file mode 100644 index 0000000000..57f7e9a003 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence11.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence12.png b/assets/examples/textures/rpg/props/generic-rpg-fence12.png new file mode 100644 index 0000000000..38c1a6505e Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence12.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence13.png b/assets/examples/textures/rpg/props/generic-rpg-fence13.png new file mode 100644 index 0000000000..78890e5914 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence13.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fence14.png b/assets/examples/textures/rpg/props/generic-rpg-fence14.png new file mode 100644 index 0000000000..0dfed6aac0 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fence14.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fish01.png b/assets/examples/textures/rpg/props/generic-rpg-fish01.png new file mode 100644 index 0000000000..313b7aff52 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fish01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fish02.png b/assets/examples/textures/rpg/props/generic-rpg-fish02.png new file mode 100644 index 0000000000..7ce035d59c Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fish02.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fish03.png b/assets/examples/textures/rpg/props/generic-rpg-fish03.png new file mode 100644 index 0000000000..17693a6c14 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fish03.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-fish04.png b/assets/examples/textures/rpg/props/generic-rpg-fish04.png new file mode 100644 index 0000000000..610dce6fd6 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-fish04.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-flower01.png b/assets/examples/textures/rpg/props/generic-rpg-flower01.png new file mode 100644 index 0000000000..464523232f Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-flower01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-flower02.png b/assets/examples/textures/rpg/props/generic-rpg-flower02.png new file mode 100644 index 0000000000..cd30eca5a3 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-flower02.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-flower03.png b/assets/examples/textures/rpg/props/generic-rpg-flower03.png new file mode 100644 index 0000000000..4d1373bbb3 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-flower03.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-flowers.png b/assets/examples/textures/rpg/props/generic-rpg-flowers.png new file mode 100644 index 0000000000..2820f5eb96 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-flowers.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-grass01.png b/assets/examples/textures/rpg/props/generic-rpg-grass01.png new file mode 100644 index 0000000000..f7718c95fb Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-grass01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-grass02.png b/assets/examples/textures/rpg/props/generic-rpg-grass02.png new file mode 100644 index 0000000000..a5e38a8ba9 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-grass02.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-house-inn.png b/assets/examples/textures/rpg/props/generic-rpg-house-inn.png new file mode 100644 index 0000000000..007f3b7318 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-house-inn.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-loot01.png b/assets/examples/textures/rpg/props/generic-rpg-loot01.png new file mode 100644 index 0000000000..5f158afab5 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-loot01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-loot02.png b/assets/examples/textures/rpg/props/generic-rpg-loot02.png new file mode 100644 index 0000000000..57732b9358 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-loot02.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-loot03.png b/assets/examples/textures/rpg/props/generic-rpg-loot03.png new file mode 100644 index 0000000000..b0c154a1b2 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-loot03.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-loot04.png b/assets/examples/textures/rpg/props/generic-rpg-loot04.png new file mode 100644 index 0000000000..83c2852320 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-loot04.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-loot05.png b/assets/examples/textures/rpg/props/generic-rpg-loot05.png new file mode 100644 index 0000000000..3eaf8173e4 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-loot05.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-mini-lake.png b/assets/examples/textures/rpg/props/generic-rpg-mini-lake.png new file mode 100644 index 0000000000..8a2d5770d2 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-mini-lake.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-rock01.png b/assets/examples/textures/rpg/props/generic-rpg-rock01.png new file mode 100644 index 0000000000..150a645baa Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-rock01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-rock02.png b/assets/examples/textures/rpg/props/generic-rpg-rock02.png new file mode 100644 index 0000000000..4803105cef Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-rock02.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-rock03.png b/assets/examples/textures/rpg/props/generic-rpg-rock03.png new file mode 100644 index 0000000000..ed8db5184b Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-rock03.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-rock04.png b/assets/examples/textures/rpg/props/generic-rpg-rock04.png new file mode 100644 index 0000000000..8a1c3a01c7 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-rock04.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-rock05.png b/assets/examples/textures/rpg/props/generic-rpg-rock05.png new file mode 100644 index 0000000000..1b5c5d1444 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-rock05.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-rock06.png b/assets/examples/textures/rpg/props/generic-rpg-rock06.png new file mode 100644 index 0000000000..79d8a58a82 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-rock06.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-rod.png b/assets/examples/textures/rpg/props/generic-rpg-rod.png new file mode 100644 index 0000000000..f0e7e170a7 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-rod.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-trasure-open.png b/assets/examples/textures/rpg/props/generic-rpg-trasure-open.png new file mode 100644 index 0000000000..2bea8b4075 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-trasure-open.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-treasure-closed.png b/assets/examples/textures/rpg/props/generic-rpg-treasure-closed.png new file mode 100644 index 0000000000..dbf5bf81a8 Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-treasure-closed.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-tree01.png b/assets/examples/textures/rpg/props/generic-rpg-tree01.png new file mode 100644 index 0000000000..6ddb47c45f Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-tree01.png differ diff --git a/assets/examples/textures/rpg/props/generic-rpg-tree02.png b/assets/examples/textures/rpg/props/generic-rpg-tree02.png new file mode 100644 index 0000000000..ef3976b66b Binary files /dev/null and b/assets/examples/textures/rpg/props/generic-rpg-tree02.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-Slice.png b/assets/examples/textures/rpg/tiles/generic-rpg-Slice.png new file mode 100644 index 0000000000..07bab3c2a7 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-Slice.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall01.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall01.png new file mode 100644 index 0000000000..3cdcd66c6f Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall01.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall02.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall02.png new file mode 100644 index 0000000000..dcfe37f634 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall02.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall03.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall03.png new file mode 100644 index 0000000000..293a6b58dc Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall03.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall04.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall04.png new file mode 100644 index 0000000000..32f1053a7a Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall04.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall05.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall05.png new file mode 100644 index 0000000000..f72d7ead1f Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall05.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall06.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall06.png new file mode 100644 index 0000000000..b61f16d2e3 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall06.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall07.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall07.png new file mode 100644 index 0000000000..8d0259e0d9 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile-waterfall07.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile01.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile01.png new file mode 100644 index 0000000000..5c6c3fc136 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile01.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile02.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile02.png new file mode 100644 index 0000000000..0fbf90abb8 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile02.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile03.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile03.png new file mode 100644 index 0000000000..3dacf2f659 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile03.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile04.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile04.png new file mode 100644 index 0000000000..dfb9977a33 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile04.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile05.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile05.png new file mode 100644 index 0000000000..b02478171e Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile05.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile06.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile06.png new file mode 100644 index 0000000000..dbc12c8b89 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile06.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile07.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile07.png new file mode 100644 index 0000000000..1bf5aa69bc Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile07.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile08.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile08.png new file mode 100644 index 0000000000..c6a715cce5 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile08.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile09.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile09.png new file mode 100644 index 0000000000..d73be99417 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile09.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile10.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile10.png new file mode 100644 index 0000000000..dedf2095b0 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile10.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile11.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile11.png new file mode 100644 index 0000000000..d0f43fc290 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile11.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile12.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile12.png new file mode 100644 index 0000000000..fbde8a9cc5 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile12.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile13.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile13.png new file mode 100644 index 0000000000..546b7fe321 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile13.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile14.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile14.png new file mode 100644 index 0000000000..7476a1df2d Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile14.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile15.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile15.png new file mode 100644 index 0000000000..b825171009 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile15.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile16.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile16.png new file mode 100644 index 0000000000..d0eab48e51 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile16.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile17.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile17.png new file mode 100644 index 0000000000..c108608bd6 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile17.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile18.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile18.png new file mode 100644 index 0000000000..7e8c31c9b8 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile18.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile19.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile19.png new file mode 100644 index 0000000000..798bd1f599 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile19.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile20.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile20.png new file mode 100644 index 0000000000..570419757b Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile20.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile21.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile21.png new file mode 100644 index 0000000000..53e54e39f5 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile21.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile22.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile22.png new file mode 100644 index 0000000000..bd8226a40a Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile22.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile23.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile23.png new file mode 100644 index 0000000000..c9ca882522 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile23.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile24.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile24.png new file mode 100644 index 0000000000..b4cc644973 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile24.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile25.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile25.png new file mode 100644 index 0000000000..40af80f1cf Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile25.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile26.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile26.png new file mode 100644 index 0000000000..d751b823a8 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile26.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile27.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile27.png new file mode 100644 index 0000000000..8a02dc2745 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile27.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile28.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile28.png new file mode 100644 index 0000000000..37fe95b73b Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile28.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile29.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile29.png new file mode 100644 index 0000000000..578299ee36 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile29.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile30.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile30.png new file mode 100644 index 0000000000..3a57cbf646 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile30.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile31.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile31.png new file mode 100644 index 0000000000..a87b16d7f8 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile31.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile32.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile32.png new file mode 100644 index 0000000000..c051b75f6d Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile32.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile33.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile33.png new file mode 100644 index 0000000000..ad559527ed Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile33.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile34.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile34.png new file mode 100644 index 0000000000..a2f9c1420d Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile34.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile35.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile35.png new file mode 100644 index 0000000000..527e7dd791 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile35.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile37.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile37.png new file mode 100644 index 0000000000..efcb8c0cbe Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile37.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile38.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile38.png new file mode 100644 index 0000000000..07bab3c2a7 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile38.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile39.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile39.png new file mode 100644 index 0000000000..0b13fb6628 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile39.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile40.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile40.png new file mode 100644 index 0000000000..191bdf0a71 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile40.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile41.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile41.png new file mode 100644 index 0000000000..cc70b01883 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile41.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile42.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile42.png new file mode 100644 index 0000000000..8b01739cde Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile42.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile43.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile43.png new file mode 100644 index 0000000000..35babee8b0 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile43.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile44.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile44.png new file mode 100644 index 0000000000..b6271ed7c7 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile44.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile45.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile45.png new file mode 100644 index 0000000000..d37df80a65 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile45.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile46.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile46.png new file mode 100644 index 0000000000..243933f772 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile46.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile47.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile47.png new file mode 100644 index 0000000000..2d568b4d59 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile47.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile48.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile48.png new file mode 100644 index 0000000000..d7827d52ba Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile48.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile49.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile49.png new file mode 100644 index 0000000000..f2d0f65546 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile49.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile50.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile50.png new file mode 100644 index 0000000000..c3dccca8c2 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile50.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile51.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile51.png new file mode 100644 index 0000000000..ca94b8c398 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile51.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile52.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile52.png new file mode 100644 index 0000000000..44bd6653ec Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile52.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile53.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile53.png new file mode 100644 index 0000000000..5ca24fa27f Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile53.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile54.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile54.png new file mode 100644 index 0000000000..0808a563b3 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile54.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile55.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile55.png new file mode 100644 index 0000000000..413224486e Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile55.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile56.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile56.png new file mode 100644 index 0000000000..5a37f17250 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile56.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile57.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile57.png new file mode 100644 index 0000000000..4e98383113 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile57.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile58.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile58.png new file mode 100644 index 0000000000..c250464a87 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile58.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile59.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile59.png new file mode 100644 index 0000000000..a0cde78a93 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile59.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile60.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile60.png new file mode 100644 index 0000000000..6e67cbb19d Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile60.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile61.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile61.png new file mode 100644 index 0000000000..bc5c8aad64 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile61.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile62.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile62.png new file mode 100644 index 0000000000..f5f4e07ada Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile62.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile63.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile63.png new file mode 100644 index 0000000000..2805264711 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile63.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile64.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile64.png new file mode 100644 index 0000000000..9aa272da9c Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile64.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile65.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile65.png new file mode 100644 index 0000000000..a60a2d4c96 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile65.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile66.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile66.png new file mode 100644 index 0000000000..1de9294ace Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile66.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile67.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile67.png new file mode 100644 index 0000000000..b53c74e306 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile67.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile68.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile68.png new file mode 100644 index 0000000000..3eb1031859 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile68.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile69.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile69.png new file mode 100644 index 0000000000..51a490cc33 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile69.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile70.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile70.png new file mode 100644 index 0000000000..07bab3c2a7 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile70.png differ diff --git a/assets/examples/textures/rpg/tiles/generic-rpg-tile71.png b/assets/examples/textures/rpg/tiles/generic-rpg-tile71.png new file mode 100644 index 0000000000..e82a487c35 Binary files /dev/null and b/assets/examples/textures/rpg/tiles/generic-rpg-tile71.png differ diff --git a/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario.png b/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario.png new file mode 100644 index 0000000000..e7b2fd085a Binary files /dev/null and b/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario.png differ diff --git a/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario01.png b/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario01.png new file mode 100644 index 0000000000..fab304a230 Binary files /dev/null and b/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario01.png differ diff --git a/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario02.png b/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario02.png new file mode 100644 index 0000000000..7b1a1d8976 Binary files /dev/null and b/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario02.png differ diff --git a/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario03.png b/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario03.png new file mode 100644 index 0000000000..b2c9c7001d Binary files /dev/null and b/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario03.png differ diff --git a/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario04.png b/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario04.png new file mode 100644 index 0000000000..27fe22397c Binary files /dev/null and b/assets/examples/textures/rpg/ui/generic-rpg-ui-inventario04.png differ diff --git a/assets/examples/textures/rpg/ui/generic-rpg-ui-text-box.png b/assets/examples/textures/rpg/ui/generic-rpg-ui-text-box.png new file mode 100644 index 0000000000..0842f8510a Binary files /dev/null and b/assets/examples/textures/rpg/ui/generic-rpg-ui-text-box.png differ diff --git a/assets/examples/textures/simplespace/License.txt b/assets/examples/textures/simplespace/License.txt new file mode 100644 index 0000000000..bdba93fb4f --- /dev/null +++ b/assets/examples/textures/simplespace/License.txt @@ -0,0 +1,22 @@ + + + Simple Space + + Created/distributed by Kenney (www.kenney.nl) + Creation date: 03-03-2021 + + ------------------------------ + + License: (Creative Commons Zero, CC0) + http://creativecommons.org/publicdomain/zero/1.0/ + + This content is free to use in personal, educational and commercial projects. + Support us by crediting Kenney or www.kenney.nl (this is not mandatory) + + ------------------------------ + + Donate: http://support.kenney.nl + Patreon: http://patreon.com/kenney/ + + Follow on Twitter for updates: + http://twitter.com/KenneyNL \ No newline at end of file diff --git a/assets/examples/textures/simplespace/enemy_A.png b/assets/examples/textures/simplespace/enemy_A.png new file mode 100644 index 0000000000..7db03b81a3 Binary files /dev/null and b/assets/examples/textures/simplespace/enemy_A.png differ diff --git a/assets/examples/textures/simplespace/enemy_B.png b/assets/examples/textures/simplespace/enemy_B.png new file mode 100644 index 0000000000..fbc35f06bf Binary files /dev/null and b/assets/examples/textures/simplespace/enemy_B.png differ diff --git a/assets/examples/textures/simplespace/ship_C.png b/assets/examples/textures/simplespace/ship_C.png new file mode 100644 index 0000000000..4f5e493701 Binary files /dev/null and b/assets/examples/textures/simplespace/ship_C.png differ diff --git a/assets/examples/textures/spiaggia_di_mondello_1k.hdr b/assets/examples/textures/spiaggia_di_mondello_1k.hdr new file mode 100644 index 0000000000..694306a88f Binary files /dev/null and b/assets/examples/textures/spiaggia_di_mondello_1k.hdr differ diff --git a/assets/favicon.png b/assets/favicon.png new file mode 100644 index 0000000000..ba52fa2cdd Binary files /dev/null and b/assets/favicon.png differ diff --git a/assets/fonts/fira-mono-v8-latin-regular.eot b/assets/fonts/fira-mono-v8-latin-regular.eot new file mode 100644 index 0000000000..9d33ae04e5 Binary files /dev/null and b/assets/fonts/fira-mono-v8-latin-regular.eot differ diff --git a/assets/fonts/fira-mono-v8-latin-regular.svg b/assets/fonts/fira-mono-v8-latin-regular.svg new file mode 100644 index 0000000000..8dd14424b5 --- /dev/null +++ b/assets/fonts/fira-mono-v8-latin-regular.svg @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/fira-mono-v8-latin-regular.ttf b/assets/fonts/fira-mono-v8-latin-regular.ttf new file mode 100644 index 0000000000..feeeb341a4 Binary files /dev/null and b/assets/fonts/fira-mono-v8-latin-regular.ttf differ diff --git a/assets/fonts/fira-mono-v8-latin-regular.woff b/assets/fonts/fira-mono-v8-latin-regular.woff new file mode 100644 index 0000000000..0c32bb9bf9 Binary files /dev/null and b/assets/fonts/fira-mono-v8-latin-regular.woff differ diff --git a/assets/fonts/fira-mono-v8-latin-regular.woff2 b/assets/fonts/fira-mono-v8-latin-regular.woff2 new file mode 100644 index 0000000000..93eeae93bb Binary files /dev/null and b/assets/fonts/fira-mono-v8-latin-regular.woff2 differ diff --git a/assets/fonts/fira-sans-v10-latin-300.eot b/assets/fonts/fira-sans-v10-latin-300.eot new file mode 100644 index 0000000000..b8c6d87389 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-300.eot differ diff --git a/assets/fonts/fira-sans-v10-latin-300.svg b/assets/fonts/fira-sans-v10-latin-300.svg new file mode 100644 index 0000000000..17349883f3 --- /dev/null +++ b/assets/fonts/fira-sans-v10-latin-300.svg @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/fira-sans-v10-latin-300.ttf b/assets/fonts/fira-sans-v10-latin-300.ttf new file mode 100644 index 0000000000..276d25d9b1 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-300.ttf differ diff --git a/assets/fonts/fira-sans-v10-latin-300.woff b/assets/fonts/fira-sans-v10-latin-300.woff new file mode 100644 index 0000000000..b685c1e2a6 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-300.woff differ diff --git a/assets/fonts/fira-sans-v10-latin-300.woff2 b/assets/fonts/fira-sans-v10-latin-300.woff2 new file mode 100644 index 0000000000..5717eb1dcb Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-300.woff2 differ diff --git a/assets/fonts/fira-sans-v10-latin-500.eot b/assets/fonts/fira-sans-v10-latin-500.eot new file mode 100644 index 0000000000..810f5c5adf Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-500.eot differ diff --git a/assets/fonts/fira-sans-v10-latin-500.svg b/assets/fonts/fira-sans-v10-latin-500.svg new file mode 100644 index 0000000000..fd63c00a57 --- /dev/null +++ b/assets/fonts/fira-sans-v10-latin-500.svg @@ -0,0 +1,329 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/fira-sans-v10-latin-500.ttf b/assets/fonts/fira-sans-v10-latin-500.ttf new file mode 100644 index 0000000000..c5c4850242 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-500.ttf differ diff --git a/assets/fonts/fira-sans-v10-latin-500.woff b/assets/fonts/fira-sans-v10-latin-500.woff new file mode 100644 index 0000000000..d64a1e1881 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-500.woff differ diff --git a/assets/fonts/fira-sans-v10-latin-500.woff2 b/assets/fonts/fira-sans-v10-latin-500.woff2 new file mode 100644 index 0000000000..bb32b14d6b Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-500.woff2 differ diff --git a/assets/fonts/fira-sans-v10-latin-800.eot b/assets/fonts/fira-sans-v10-latin-800.eot new file mode 100644 index 0000000000..ffcc368feb Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-800.eot differ diff --git a/assets/fonts/fira-sans-v10-latin-800.svg b/assets/fonts/fira-sans-v10-latin-800.svg new file mode 100644 index 0000000000..bc32da17ad --- /dev/null +++ b/assets/fonts/fira-sans-v10-latin-800.svg @@ -0,0 +1,328 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/fira-sans-v10-latin-800.ttf b/assets/fonts/fira-sans-v10-latin-800.ttf new file mode 100644 index 0000000000..6ffb490c13 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-800.ttf differ diff --git a/assets/fonts/fira-sans-v10-latin-800.woff b/assets/fonts/fira-sans-v10-latin-800.woff new file mode 100644 index 0000000000..cac479b79d Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-800.woff differ diff --git a/assets/fonts/fira-sans-v10-latin-800.woff2 b/assets/fonts/fira-sans-v10-latin-800.woff2 new file mode 100644 index 0000000000..37a989c620 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-800.woff2 differ diff --git a/assets/fonts/fira-sans-v10-latin-italic.eot b/assets/fonts/fira-sans-v10-latin-italic.eot new file mode 100644 index 0000000000..bd8184c35c Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-italic.eot differ diff --git a/assets/fonts/fira-sans-v10-latin-italic.svg b/assets/fonts/fira-sans-v10-latin-italic.svg new file mode 100644 index 0000000000..55ceba89b2 --- /dev/null +++ b/assets/fonts/fira-sans-v10-latin-italic.svg @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/fira-sans-v10-latin-italic.ttf b/assets/fonts/fira-sans-v10-latin-italic.ttf new file mode 100644 index 0000000000..416c710dd1 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-italic.ttf differ diff --git a/assets/fonts/fira-sans-v10-latin-italic.woff b/assets/fonts/fira-sans-v10-latin-italic.woff new file mode 100644 index 0000000000..5e82e183f3 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-italic.woff differ diff --git a/assets/fonts/fira-sans-v10-latin-italic.woff2 b/assets/fonts/fira-sans-v10-latin-italic.woff2 new file mode 100644 index 0000000000..7f191fd8ea Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-italic.woff2 differ diff --git a/assets/fonts/fira-sans-v10-latin-regular.eot b/assets/fonts/fira-sans-v10-latin-regular.eot new file mode 100644 index 0000000000..7abf4c2f68 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-regular.eot differ diff --git a/assets/fonts/fira-sans-v10-latin-regular.svg b/assets/fonts/fira-sans-v10-latin-regular.svg new file mode 100644 index 0000000000..1e520978de --- /dev/null +++ b/assets/fonts/fira-sans-v10-latin-regular.svg @@ -0,0 +1,330 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/fonts/fira-sans-v10-latin-regular.ttf b/assets/fonts/fira-sans-v10-latin-regular.ttf new file mode 100644 index 0000000000..572e442e38 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-regular.ttf differ diff --git a/assets/fonts/fira-sans-v10-latin-regular.woff b/assets/fonts/fira-sans-v10-latin-regular.woff new file mode 100644 index 0000000000..d99ba57a35 Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-regular.woff differ diff --git a/assets/fonts/fira-sans-v10-latin-regular.woff2 b/assets/fonts/fira-sans-v10-latin-regular.woff2 new file mode 100644 index 0000000000..9bb576032e Binary files /dev/null and b/assets/fonts/fira-sans-v10-latin-regular.woff2 differ diff --git a/assets/github-mark-white.svg b/assets/github-mark-white.svg new file mode 100644 index 0000000000..d5e6491854 --- /dev/null +++ b/assets/github-mark-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/github-mark.svg b/assets/github-mark.svg new file mode 100644 index 0000000000..37fa923df3 --- /dev/null +++ b/assets/github-mark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/github.svg b/assets/github.svg new file mode 100644 index 0000000000..3265c45c8d --- /dev/null +++ b/assets/github.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/assets/github_grey.svg b/assets/github_grey.svg new file mode 100644 index 0000000000..f9e4f427af --- /dev/null +++ b/assets/github_grey.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/assets/heart.svg b/assets/heart.svg new file mode 100644 index 0000000000..9991801df2 --- /dev/null +++ b/assets/heart.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets/hot_reloading.svg b/assets/hot_reloading.svg new file mode 100644 index 0000000000..20bb001065 --- /dev/null +++ b/assets/hot_reloading.svg @@ -0,0 +1,118 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icon-chevron-down.svg b/assets/icon-chevron-down.svg new file mode 100644 index 0000000000..9c14fc57d7 --- /dev/null +++ b/assets/icon-chevron-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icon-chevron-left.svg b/assets/icon-chevron-left.svg new file mode 100644 index 0000000000..2b89cb257d --- /dev/null +++ b/assets/icon-chevron-left.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icon-chevron-right.svg b/assets/icon-chevron-right.svg new file mode 100644 index 0000000000..c7e0d0b4f7 --- /dev/null +++ b/assets/icon-chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icon-docs-dev.png b/assets/icon-docs-dev.png new file mode 100644 index 0000000000..aad24246ef Binary files /dev/null and b/assets/icon-docs-dev.png differ diff --git a/assets/icon-docs-dev.svg b/assets/icon-docs-dev.svg new file mode 100644 index 0000000000..7950fcd2c4 --- /dev/null +++ b/assets/icon-docs-dev.svg @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icon-github.svg b/assets/icon-github.svg new file mode 100644 index 0000000000..c4133fd1b9 --- /dev/null +++ b/assets/icon-github.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icon-hamburger.svg b/assets/icon-hamburger.svg new file mode 100644 index 0000000000..af082ad488 --- /dev/null +++ b/assets/icon-hamburger.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/icon-pencil.svg b/assets/icon-pencil.svg new file mode 100644 index 0000000000..c5f73b6be0 --- /dev/null +++ b/assets/icon-pencil.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icon-times.svg b/assets/icon-times.svg new file mode 100644 index 0000000000..940269184e --- /dev/null +++ b/assets/icon-times.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000..8c9640bf27 Binary files /dev/null and b/assets/icon.png differ diff --git a/assets/index.html b/assets/index.html new file mode 100644 index 0000000000..ac48108488 --- /dev/null +++ b/assets/index.html @@ -0,0 +1,12932 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bevy Assets + + + +
+ +
+
+ + +
+ +
+ + Assets + +
+
+ + + + + +
+
+
+
+ + + + + + + + + + + +
+
+
+ + +
    + + + + + + + + +
  • +
    + Learning + +
    + +
  • + + + + + + + + + + + + +
  • +
    + Assets + + + +
    + +
      + + + + + + + + +
    • +
      + 2D + +
      + +
    • + + + + + + + + + +
    • +
      + 3D + +
      + +
    • + + + + + + + + + +
    • +
      + AI + +
      + +
    • + + + + + + + + + +
    • + + +
    • + + + + + + + + + +
    • +
      + Animation + +
      + +
    • + + + + + + + + + +
    • + + +
    • + + + + + + + + + +
    • +
      + Audio + +
      + +
    • + + + + + + + + + +
    • +
      + Backends + +
      + +
    • + + + + + + + + + +
    • +
      + Camera + +
      + +
    • + + + + + + + + + +
    • + + +
    • + + + + + + + + + +
    • +
      + Devices + +
      + +
    • + + + + + + + + + +
    • +
      + Helpers + +
      + +
    • + + + + + + + + + +
    • +
      + Input + +
      + +
    • + + + + + + + + + +
    • +
      + Networking + +
      + +
    • + + + + + + + + + +
    • +
      + Persistence + +
      + +
    • + + + + + + + + + +
    • +
      + Physics + +
      + +
    • + + + + + + + + + +
    • + + +
    • + + + + + + + + + +
    • +
      + Scripting + +
      + +
    • + + + + + + + + + +
    • +
      + Shapes + +
      + +
    • + + + + + + + + + +
    • +
      + Social + +
      + +
    • + + + + + + + + + +
    • +
      + Templates + +
      + +
    • + + + + + + + + + +
    • +
      + UI + +
      + +
    • + + +
    + +
  • + + + + + + + + + + + + +
  • +
    + Apps + + + +
    + +
      + + + + + + + + +
    • +
      + Games + +
      + +
    • + + + + + + + + + +
    • +
      + Tools + +
      + +
    • + + +
    + +
  • + + +
+ + +
+
+
+ +
+ + + + + + < + + + + + + + + +
+ A collection of third-party Bevy assets, plugins, learning resources, and apps made by the community. If you would like to + share what you're working on, submit a pull request! +
+ + + + +

+ Learning# +

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +

+ Assets# +

+ + + + + + + + +

+ 2D# +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+ 3D# +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+ AI# +

+ + + + + +

+ Accessibility# +

+ + + + + +

+ Animation# +

+ + + + + +

+ Asset Loading# +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+ Audio# +

+ + + + + +

+ Backends# +

+ + + + + +

+ Camera# +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+ Development tools# +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+ Devices# +

+ + + + + +

+ Helpers# +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+ Input# +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+ Networking# +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+ Persistence# +

+ + + + + +

+ Physics# +

+ + + + + +

+ Platform Integration# +

+ + + + + +

+ Scripting# +

+ + + + + +

+ Shapes# +

+ + + + + +

+ Social# +

+ + + + + +

+ Templates# +

+ + + + + +

+ UI# +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +

+ Apps# +

+ + + + + + + + +

+ Games# +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+ Tools# +

+ + + + +
+ + + +
+
+ +
+
+
+ + + diff --git a/assets/itchio-textless.svg b/assets/itchio-textless.svg new file mode 100644 index 0000000000..3e0081f058 --- /dev/null +++ b/assets/itchio-textless.svg @@ -0,0 +1 @@ + diff --git a/assets/keygen.png b/assets/keygen.png new file mode 100644 index 0000000000..04e39d11bb Binary files /dev/null and b/assets/keygen.png differ diff --git a/assets/learning/Bevy-Basics.png b/assets/learning/Bevy-Basics.png new file mode 100644 index 0000000000..07e3464b6d Binary files /dev/null and b/assets/learning/Bevy-Basics.png differ diff --git a/assets/learning/Learn_Bevy_0-10_Video_Tutorial_Series.png b/assets/learning/Learn_Bevy_0-10_Video_Tutorial_Series.png new file mode 100644 index 0000000000..8414ec05bf Binary files /dev/null and b/assets/learning/Learn_Bevy_0-10_Video_Tutorial_Series.png differ diff --git a/assets/learning/a-walkthrough-of-bevy-011-rendering/index.html b/assets/learning/a-walkthrough-of-bevy-011-rendering/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/a-walkthrough-of-bevy-011-rendering/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/bevy-basics/index.html b/assets/learning/bevy-basics/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/bevy-basics/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/bevy-cheatbook/index.html b/assets/learning/bevy-cheatbook/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/bevy-cheatbook/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/choosing-your-networking-architecture/index.html b/assets/learning/choosing-your-networking-architecture/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/choosing-your-networking-architecture/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/index.html b/assets/learning/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/assets/learning/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/intro-to-bevy-video-tutorials/index.html b/assets/learning/intro-to-bevy-video-tutorials/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/intro-to-bevy-video-tutorials/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/learn-bevy-010/index.html b/assets/learning/learn-bevy-010/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/learn-bevy-010/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/learn-bevys-ecs-by-ripping-off-someone-elses-project/index.html b/assets/learning/learn-bevys-ecs-by-ripping-off-someone-elses-project/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/learn-bevys-ecs-by-ripping-off-someone-elses-project/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/making-a-p2p-web-game-with-rollback/index.html b/assets/learning/making-a-p2p-web-game-with-rollback/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/making-a-p2p-web-game-with-rollback/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/making-a-rhythm-game/index.html b/assets/learning/making-a-rhythm-game/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/making-a-rhythm-game/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/making-a-snake-clone/index.html b/assets/learning/making-a-snake-clone/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/making-a-snake-clone/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/making-chess-clone-in-3d/index.html b/assets/learning/making-chess-clone-in-3d/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/making-chess-clone-in-3d/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/mazdigital-blog/index.html b/assets/learning/mazdigital-blog/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/mazdigital-blog/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/minesweeper-tutorial.png b/assets/learning/minesweeper-tutorial.png new file mode 100644 index 0000000000..99a03a3b0a Binary files /dev/null and b/assets/learning/minesweeper-tutorial.png differ diff --git a/assets/learning/minesweeper-tutorial/index.html b/assets/learning/minesweeper-tutorial/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/minesweeper-tutorial/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/official-bevy-examples.png b/assets/learning/official-bevy-examples.png new file mode 100644 index 0000000000..5e72defd21 Binary files /dev/null and b/assets/learning/official-bevy-examples.png differ diff --git a/assets/learning/official-bevy-examples/index.html b/assets/learning/official-bevy-examples/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/official-bevy-examples/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/official-migration-guides/index.html b/assets/learning/official-migration-guides/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/official-migration-guides/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/understanding-dynamic-queries-in-bevy-011/index.html b/assets/learning/understanding-dynamic-queries-in-bevy-011/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/understanding-dynamic-queries-in-bevy-011/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/learning/using-rapier-for-physics/index.html b/assets/learning/using-rapier-for-physics/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/assets/learning/using-rapier-for-physics/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/assets/mastodon-logo-purple.svg b/assets/mastodon-logo-purple.svg new file mode 100644 index 0000000000..0f8baebfc9 --- /dev/null +++ b/assets/mastodon-logo-purple.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/meetkai.png b/assets/meetkai.png new file mode 100644 index 0000000000..263ceb8ff8 Binary files /dev/null and b/assets/meetkai.png differ diff --git a/assets/metabuild.png b/assets/metabuild.png new file mode 100644 index 0000000000..af056dba55 Binary files /dev/null and b/assets/metabuild.png differ diff --git a/assets/migration-guides.svg b/assets/migration-guides.svg new file mode 100644 index 0000000000..7538e7d526 --- /dev/null +++ b/assets/migration-guides.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/opensource.svg b/assets/opensource.svg new file mode 100644 index 0000000000..d3b7fdb831 --- /dev/null +++ b/assets/opensource.svg @@ -0,0 +1,85 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/assets/pager_next.svg b/assets/pager_next.svg new file mode 100644 index 0000000000..c2a5271236 --- /dev/null +++ b/assets/pager_next.svg @@ -0,0 +1,67 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets/pager_previous.svg b/assets/pager_previous.svg new file mode 100644 index 0000000000..870dc2b65d --- /dev/null +++ b/assets/pager_previous.svg @@ -0,0 +1,67 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets/people.svg b/assets/people.svg new file mode 100644 index 0000000000..7674116346 --- /dev/null +++ b/assets/people.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/platform-icons.svg b/assets/platform-icons.svg new file mode 100644 index 0000000000..2ec811c47e --- /dev/null +++ b/assets/platform-icons.svg @@ -0,0 +1,67 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/assets/progressbar.svg b/assets/progressbar.svg new file mode 100644 index 0000000000..7cc817a4e0 --- /dev/null +++ b/assets/progressbar.svg @@ -0,0 +1,80 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/assets/q_and_a.svg b/assets/q_and_a.svg new file mode 100644 index 0000000000..8049d2cd40 --- /dev/null +++ b/assets/q_and_a.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/reddit.svg b/assets/reddit.svg new file mode 100644 index 0000000000..f919941c1b --- /dev/null +++ b/assets/reddit.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/assets/render_graph.svg b/assets/render_graph.svg new file mode 100644 index 0000000000..fd646179e4 --- /dev/null +++ b/assets/render_graph.svg @@ -0,0 +1,130 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/rust-logo-light.svg b/assets/rust-logo-light.svg new file mode 100644 index 0000000000..adfbc16f56 --- /dev/null +++ b/assets/rust-logo-light.svg @@ -0,0 +1,47 @@ + +image/svg+xml diff --git a/assets/scene.svg b/assets/scene.svg new file mode 100644 index 0000000000..ee40dc9d54 --- /dev/null +++ b/assets/scene.svg @@ -0,0 +1,133 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/sound.svg b/assets/sound.svg new file mode 100644 index 0000000000..29ef0dc755 --- /dev/null +++ b/assets/sound.svg @@ -0,0 +1,120 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/sprite.png b/assets/sprite.png new file mode 100644 index 0000000000..cf727f1f30 Binary files /dev/null and b/assets/sprite.png differ diff --git a/assets/striked.png b/assets/striked.png new file mode 100644 index 0000000000..fbb42bfe36 Binary files /dev/null and b/assets/striked.png differ diff --git a/assets/twitter.svg b/assets/twitter.svg new file mode 100644 index 0000000000..63feecfaed --- /dev/null +++ b/assets/twitter.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/assets/twitter_grey.svg b/assets/twitter_grey.svg new file mode 100644 index 0000000000..16fe8aeb5b --- /dev/null +++ b/assets/twitter_grey.svg @@ -0,0 +1,53 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/assets/vertex_studio.png b/assets/vertex_studio.png new file mode 100644 index 0000000000..e7138d1346 Binary files /dev/null and b/assets/vertex_studio.png differ diff --git a/assets/whats_a_bevy.svg b/assets/whats_a_bevy.svg new file mode 100644 index 0000000000..70972d1424 --- /dev/null +++ b/assets/whats_a_bevy.svg @@ -0,0 +1,208 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ? + + diff --git a/assets/youtube.svg b/assets/youtube.svg new file mode 100644 index 0000000000..aa8fc32a3c --- /dev/null +++ b/assets/youtube.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/assets/youtube_grey.svg b/assets/youtube_grey.svg new file mode 100644 index 0000000000..768e0fa3d0 --- /dev/null +++ b/assets/youtube_grey.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/atom.xml b/atom.xml new file mode 100644 index 0000000000..d6f205004d --- /dev/null +++ b/atom.xml @@ -0,0 +1,14880 @@ + + + Bevy Engine + + + Zola + 2023-09-21T00:00:00+00:00 + https://bevyengine.org/atom.xml + + Community Reflection on Bevy's Third Year + 2023-09-21T00:00:00+00:00 + 2023-09-21T00:00:00+00:00 + + https://bevyengine.org/news/community-reflection-on-bevys-third-year/ + <p><a href="https://www.twitter.com/cart_cart">@cart</a> here (Bevy's creator and Project Lead) with another update! A little over a month ago was Bevy's Third Birthday! As is tradition, I took that as a chance to reflect on the past year and outline my hopes and dreams for the future. You can read that in my <a href="https://bevyengine.org/news/bevys-third-birthday/">Bevy's Third Birthday</a> post.</p> +<p>This year for the first time I also encouraged the Bevy community to write their own reflections on Bevy's third year in a similar style, and to <a href="https://github.com/bevyengine/bevy-website/issues/728">post them here</a>.</p> +<span id="continue-reading"></span><h2 id="what-is-bevy">What is Bevy? +<a class="anchor-link" href="#what-is-bevy">#</a> +</h2> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. Bevy is also free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. We have a <a href="/learn/book/getting-started/">Quick Start Guide</a> and a <a href="/learn/book/introduction/">Bevy Book</a>. You can also check out <a href="/assets/">Bevy Assets</a> for a library of community-developed plugins, crates, games, and learning resources.</p> +<h2 id="reflections">Reflections +<a class="anchor-link" href="#reflections">#</a> +</h2> +<p>We had a number of responses! Here is a central collection of <strong>Bevy's Third Birthday</strong> posts:</p> +<ul> +<li><strong>Carter Anderson (<a href="https://github.com/cart">@cart</a>)</strong> <span class="people-role people-role-inline people-role-project-lead">Project Lead</span><span class="people-role people-role-inline people-role-maintainer">Maintainer</span> +<ul> +<li><a href="https://bevyengine.org/news/bevys-third-birthday/">Bevy's Third Birthday</a></li> +</ul> +</li> +<li><strong>Alice Cecile (<a href="https://github.com/alice-i-cecile">@alice-i-cecile</a>)</strong> <span class="people-role people-role-inline people-role-maintainer">Maintainer</span> +<ul> +<li><a href="https://www.leafwing-studios.com/blog/triage-by-controversy/">Triage-by-controversy and community review</a></li> +</ul> +</li> +<li><strong>Nicola Papale (<a href="https://github.com/nicopap">@nicopap</a>)</strong> +<ul> +<li><a href="https://devildahu.ch/devlog/bevy-3-years/">A Year of Bevy, Past and Future</a></li> +</ul> +</li> +<li><strong>Mike (<a href="https://github.com/hymm">@hymm</a>)</strong> +<ul> +<li><a href="https://www.hsubox.design/posts/looking-back-at-stageless/">Looking Back at Stageless</a></li> +</ul> +</li> +<li><strong>Trent (<a href="https://github.com/tbillington">@tbillington</a>)</strong> +<ul> +<li><a href="https://trent.kiwi/bevy-three-years">Three Years of Bevy 🎉</a></li> +</ul> +</li> +<li><strong>JMS55 (<a href="https://github.com/JMS55">@JMS55</a>)</strong> +<ul> +<li><a href="https://jms55.github.io/posts/2023-12-09-bevy-third-birthday/">Bevy's Third Birthday - Reflections on Rendering</a></li> +</ul> +</li> +</ul> +<h2 id="what-are-we-working-on-right-now">What are we working on right now? +<a class="anchor-link" href="#what-are-we-working-on-right-now">#</a> +</h2> +<p>Here are some things we have coming up!</p> +<ul> +<li><a href="https://github.com/bevyengine/bevy/discussions/9538">Bevy UI and Scene system overhaul</a>: I just proposed a brand new unified Bevy UI and Bevy Scene system to give us solid foundations to build the Bevy Editor on. This will allow users to compose, nest, override, and style scenes and UI both in code and in asset files. All using the same ergonomic format supporting hot reloading, IDE autocomplete, and more! This is both a design document and an initial prototype. The community has been reacting to and iterating on the initial design.</li> +<li><a href="https://github.com/bevyengine/bevy/pull/8624">Bevy Asset V2</a>: We recently merged Bevy Asset V2 ... a brand new production grade asset system for Bevy. It adds asset preprocessing, as well as massive, improvements to the asset APIs and internals. We also have a <a href="https://github.com/bevyengine/bevy/issues/9714">ton of additional features</a> planned that build on top of it. I'm almost finished adding &quot;multiple asset sources&quot;, so you can load (and process) assets from &quot;anywhere&quot; (including mixing and matching sources).</li> +<li><a href="https://github.com/bevyengine/bevy/pull/9685">Automatic batching and instancing of draw commands</a>: This adds some initial &quot;automatic batching&quot; support, giving us some nice wins. We have big plans for continuing to optimize the renderer. This is just the beginning!</li> +<li><a href="https://github.com/bevyengine/naga_oil/pull/41">Rusty Shader Imports</a>: We're improving the usability and terseness of our import system by adopting rust-like syntax and functionality. Imports will feel much more natural after this.</li> +<li><a href="https://github.com/bevyengine/bevy/pull/9258">Deferred Rendering</a>: We're considering merging deferred rendering functionality into Bevy, and we have a working implementation! Lots of things to consider here before committing though.</li> +<li><a href="https://github.com/bevyengine/bevy/pull/8784">GPU Picking</a>: We have a GPU picking proposal that would add fast and accurate GPU-driven object picking to Bevy (identifying objects when they are clicked on).</li> +<li><a href="https://github.com/bevyengine/bevy/pull/8006">PCF for Shadows</a>: Shadows will have nice PCF filters that will drastically increase their quality.</li> +<li><a href="https://github.com/bevyengine/bevy/pull/8015">Light Transmission for Materials</a>: We're adding support for simulating light penetrating our PBR material, which lets us render things like glass, wax, rubber, etc with higher quality.</li> +<li><a href="https://github.com/bevyengine/bevy/pull/8973">UI Node Borders and Shadows</a>: This will improve the ability to express UIs by giving additional style options to users.</li> +<li><a href="https://github.com/bevyengine/bevy/pull/8453">System Stepping</a>: We are considering merging &quot;system stepping&quot;, which would give users the ability to pause execution and run systems step-by step. This should make some debugging scenarios much easier!</li> +<li><a href="https://github.com/bevyengine/bevy/pulls">And plenty more!</a></li> +</ul> +<p><strong>Bevy 0.12</strong> will be released mid-October and some of these (including Bevy Asset V2) will be included!</p> +<p>Here is to another year of Bevy!</p> +<p>- <a href="https://github.com/cart/">@cart</a></p> +<img src="/assets/bevy_logo_dark.svg" style="height: 4.0rem; margin-top: 1.5rem" /> + + + + Bevy's Third Birthday + 2023-08-10T00:00:00+00:00 + 2023-08-10T00:00:00+00:00 + + https://bevyengine.org/news/bevys-third-birthday/ + <p><a href="https://www.twitter.com/cart_cart">@cart</a> here (Bevy's creator and Project Lead) with an exciting announcement ... it has now been three years since the initial Bevy release!</p> +<p>As is tradition, I will take this as a chance to reflect on the past year and outline our hopes and dreams for the future. If you're curious, check out Bevy's <a href="/news/bevys-first-birthday">First Birthday</a> and <a href="/news/bevys-second-birthday">Second Birthday</a> posts.</p> +<p>This year, I am also highly encouraging everyone to write their own &quot;Bevy Birthday&quot; reflection posts. Just publish your post somewhere (and to social media if you want) and <a href="https://github.com/bevyengine/bevy-website/issues/728">link to it here</a>. One month from now, we will do a followup &quot;Reflecting on Bevy's Third Year&quot; rollup post that aggregates these in one place. This is our chance as a community to celebrate our wins, identify improvement areas, and calibrate our path for the next year.</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. Bevy is also free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. We have a <a href="/learn/book/getting-started/">Quick Start Guide</a> and a <a href="/learn/book/introduction/">Bevy Book</a>. You can also check out <a href="/assets/">Bevy Assets</a> for a library of community-developed plugins, crates, games, and learning resources.</p> +<span id="continue-reading"></span><h2 id="a-year-of-milestones">A Year of Milestones +<a class="anchor-link" href="#a-year-of-milestones">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-third-birthday/milestones.svg" alt="milestones" /></p> +<ul> +<li><strong>August 19</strong>: <a href="https://itch.io/jam/bevy-jam-2">Bevy Jam #2: Combine</a> +<ul> +<li>The second official Bevy game jam! 404 people joined, 85 people submitted games, and people left 2,674 ratings. <a href="https://ramirezmike2.itch.io/usa-football-league-scouting-combine-xlv">USA Football League Scouting Combine XLV</a> won!</li> +</ul> +</li> +<li><strong>October 18</strong>: Bevy hits 20,000 stars on GitHub!</li> +<li><strong>November 12</strong>: <a href="/news/bevy-0-9/">Bevy 0.9</a> +<ul> +<li>We added HDR Post Processing, Tonemapping, and Bloom, FXAA, Deband Dithering, Post Processing API Improvements, a New Scene Format, Code Driven Scene Construction, Improved Entity/Component APIs, Exclusive System Rework, Enum Reflection, Time Shader Globals, Plugin Settings, Bevy UI Z-Indices, and more!</li> +</ul> +</li> +<li><strong>November 20</strong>: Bevy becomes the <a href="https://mastodon.social/@cart/109377799039003731">second most popular game engine on GitHub</a></li> +<li><strong>January 14</strong>: James Liu (@james7132) <a href="/news/scaling-bevy-development/#a-new-maintainer">becomes a Maintainer</a></li> +<li><strong>January 14</strong>: New Bevy Organization Role: <a href="/news/scaling-bevy-development">Subject Matter Expert</a></li> +<li><strong>January 14</strong>: The <a href="/community/people/">Bevy People</a> page is launched</li> +<li><strong>March 6</strong>: <a href="/news/bevy-0-10/">Bevy 0.10</a> +<ul> +<li>We added ECS Schedule v3, Cascaded Shadow Maps, Environment Map Lighting, Depth and Normal Prepass, Smooth Skeletal Animation Transitions, Improved Android Support, Revamped Bloom, Distance and Atmospheric Fog, StandardMaterial Blend Modes, More Tonemapping Choices, Color Grading, Parallel Pipelined Rendering, Windows as Entities, Renderer Optimizations, ECS Optimizations, and more!</li> +</ul> +</li> +<li><strong>April 1</strong>: <a href="https://itch.io/jam/bevy-jam-3">Bevy Jam #3: Side Effects</a> +<ul> +<li>The third official Bevy game jam! 353 people joined, 78 people submitted games, and people left 2,158 ratings. <a href="https://kuviman.itch.io/linksider">Link Sider</a> won!</li> +</ul> +</li> +<li><strong>July 9</strong>: <a href="/news/bevy-0-11/">Bevy 0.11</a> +<ul> +<li>We added Screen Space Ambient Occlusion (SSAO), Temporal Anti-Aliasing (TAA), Morph Targets, Robust Contrast Adaptive Sharpening (RCAS), WebGPU Support, Improved Shader Imports, Parallax Mapping, Schedule-First ECS APIs, Immediate Mode Gizmo Rendering, ECS Audio APIs, UI Borders, Grid UI Layout, UI Performance Improvements, and more!</li> +</ul> +</li> +<li><strong>August 10</strong>: Bevy is now three years old!</li> +</ul> +<h2 id="a-year-by-the-numbers">A Year By The Numbers +<a class="anchor-link" href="#a-year-by-the-numbers">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-third-birthday/numbers.svg" alt="numbers" /></p> +<ul> +<li><strong>741</strong> unique Bevy contributors on <a href="https://github.com/bevyengine">GitHub</a> (up from 470)</li> +<li><strong>25,222</strong> <a href="https://github.com/bevyengine">GitHub</a> stars (up from 17,830)</li> +<li><strong>2,541</strong> forks on <a href="https://github.com/bevyengine">GitHub</a> (up from 1,693)</li> +<li><strong>5,732</strong> pull requests (3,993 merged) on <a href="https://github.com/bevyengine">GitHub</a> (up from 3,610 prs and 2,354 merged)</li> +<li><strong>3497</strong> issues (2290 closed) on <a href="https://github.com/bevyengine">GitHub</a> (up from 2,228 and 1,303 closed)</li> +<li><strong>5214</strong> commits on <a href="https://github.com/bevyengine">GitHub</a> (up from 3,629)</li> +<li><strong>874</strong> <a href="https://github.com/bevyengine/bevy/discussions">GitHub Discussions</a> (up from 470)</li> +<li><strong>281</strong> <a href="/assets/">Bevy Assets</a> (plugins, crates, games, apps, and learning materials) (up from 191)</li> +<li><strong>661,020</strong> downloads on <a href="https://crates.io/crates/bevy">crates.io</a> (up from 206,328)</li> +<li><strong>712</strong> <a href="https://twitter.com/BevyEngine">@BevyEngine</a> retweets of Bevy community content on Twitter (up from 382)</li> +<li><strong>14,244</strong> <a href="https://discord.com/invite/bevy">Bevy Discord</a> members (up from 9,686)</li> +<li><strong>3202</strong> community #showcase entries in the <a href="https://discord.com/invite/bevy">Bevy Discord</a> (up from 1,789)</li> +<li><strong>1,424,903</strong> messages in the <a href="https://discord.com/invite/bevy">Bevy Discord</a> (up from 968,290)</li> +</ul> +<p>Note that for consistency and clarity all of these numbers are given in &quot;absolute totals&quot;, as that is how they are generally reported. For example, we now have 25,222 <em>total</em> GitHub stars ... the number you will see in our repo. I've included the totals as reported last year as well, which can be used to calculate the change in the numbers since last year.</p> +<h2 id="things-i-m-proud-of">Things I'm Proud Of +<a class="anchor-link" href="#things-i-m-proud-of">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-third-birthday/proud.svg" alt="proud" /></p> +<p>I'll try not to repeat myself here, but note that I am still extremely proud of the things I outlined in Bevy's <a href="/news/bevys-first-birthday">First Birthday</a> and <a href="/news/bevys-second-birthday">Second Birthday</a> posts.</p> +<h3 id="scaling-the-organization">Scaling the Organization +<a class="anchor-link" href="#scaling-the-organization">#</a> +</h3> +<p>This year we rolled out <a href="/news/scaling-bevy-development">Subject Matter Experts</a> to give autonomy to developers that have proven their technical chops and alignment with Bevy project direction in key subject areas. Historically, only the Project Lead (me) could resolve &quot;controversial&quot; changes (large, foundational, or far reaching changes to the engine). Subject Matter Expert approvals on PRs count as &quot;votes&quot;. If two Subject Matter Experts approve a controversial PR, it can be merged without Project Lead approval.</p> +<p>This gave people that have helped make Bevy amazing a seat at the table and allowed us to scale out development. We merged 345 more PRs this year than we did last year!</p> +<h3 id="renderer-features">Renderer Features +<a class="anchor-link" href="#renderer-features">#</a> +</h3> +<p>This was an outstanding year for the Bevy Renderer. We added <a href="/news/bevy-0-11/#screen-space-ambient-occlusion">Screen Space Ambient Occlusion</a>, <a href="/news/bevy-0-10/#cascaded-shadow-maps">Cascaded Shadow Maps</a>, <a href="/news/bevy-0-10/#environment-map-lighting">Environment Map Lighting</a>, <a href="/news/bevy-0-11/#skyboxes">Skyboxes</a>, <a href="/news/bevy-0-9/#fxaa-fast-approximate-anti-aliasing">FXAA</a>, <a href="/news/bevy-0-11/#temporal-anti-aliasing">TAA</a>, <a href="/news/bevy-0-11/#parallax-mapping">Parallax Mapping</a>, <a href="/news/bevy-0-11/#morph-targets">Morph Targets</a>, <a href="/news/bevy-0-9/#hdr-post-processing-tonemapping-and-bloom">HDR Tonemapping and Bloom</a>, <a href="/news/bevy-0-10/#revamped-bloom">Revamped Bloom</a>, <a href="/news/bevy-0-10/#distance-and-atmospheric-fog">Distance and Atmospheric Fog</a>, <a href="/news/bevy-0-10/#smooth-skeletal-animation-transitions">Smooth Skeletal Animation Transitions</a>, <a href="/news/bevy-0-10/#more-tonemapping-choices">More Tonemapping Choices</a>, <a href="/news/bevy-0-11/#robust-contrast-adaptive-sharpening">Robust Contrast Adaptive Sampling</a>, <a href="/news/bevy-0-11/#webgpu-support">WebGPU Support</a>, <a href="/news/bevy-0-10/#parallel-pipelined-rendering">Enabled Parallel Pipelined Rendering</a> , <a href="/news/bevy-0-10/#standardmaterial-blend-modes">StandardMaterial Blend Modes</a>, <a href="/news/bevy-0-10/#depth-and-normal-prepass">Depth and Normal Prepass</a>, <a href="/news/bevy-0-10/#shadow-mapping-using-prepass-shaders">Shadow Mapping Using Prepass Shaders</a>, <a href="/news/bevy-0-11/#gizmos">Gizmos</a>, <a href="/news/bevy-0-9/#deband-dithering">Deband Dithering</a>, <a href="/news/bevy-0-9/#post-processing-view-target-double-buffering">Post Processing APIs</a>, <a href="/news/bevy-0-9/#ktx2-array-cubemap-cubemap-array-textures">KTX2 Array/ Cubemap / Cubemap Array Textures</a>.</p> +<p>And those are just the highlights! If you click on the links above you'll note that there are a <em>ton</em> of different people building out Bevy's renderer. The <a href="https://discord.gg/bevy"><code>#rendering-dev</code></a> channel on our Discord has really picked up steam.</p> +<h3 id="bevy-ecs-api-goodness">Bevy ECS API Goodness +<a class="anchor-link" href="#bevy-ecs-api-goodness">#</a> +</h3> +<p>I am very pleased with the state of Bevy ECS right now. This year the trend was &quot;make more things express-able&quot; and &quot;make expressing things easier&quot;:</p> +<ul> +<li><a href="/news/bevy-0-10/#ecs-schedule-v3">ECS Schedule V3</a> made it possible (and easy) to insert arbitrary sync points (and exclusive systems) into schedules, removing the need for creating new &quot;stages&quot; in these cases.</li> +<li><a href="/news/bevy-0-10/#configurable-system-sets">System Sets</a> made it easier to configure groups of systems.</li> +<li>You can now add multiple systems with a single <a href="/news/bevy-0-10/#adding-systems">add_systems</a> call.</li> +<li>You can configure arbitrary groups of these systems with <a href="/news/bevy-0-11/#nested-system-tuples-and-chaining">nested System tuples and chaining</a> and <a href="/news/bevy-0-11/#run-if-for-tuples-of-systems">run_if for tuples of systems</a>.</li> +<li><a href="/news/bevy-0-11/#schedule-first-ecs-apis">Schedule-First Apis</a> removed a lot of API bloat and sanded down the remaining rough edges from the scheduler rework.</li> +<li>Exclusive systems are now <a href="/news/bevy-0-9/#exclusive-system-rework">just normal systems</a>.</li> +<li>We implemented Bundle for Component which enabled us to <a href="/news/bevy-0-9/#improved-entity-component-apis">unify our entity APIs</a>.</li> +<li>There were internal quality improvements such as <a href="/news/bevy-0-9/#bevy-ecs-now-uses-gats">GATs</a> and <a href="/news/bevy-0-10/#unsafeworldcell-and-unsafeentitycell">UnsafeWorldCell</a>, which made the internals easier and safer to work on.</li> +</ul> +<p>I think that as of <strong>Bevy 0.11</strong>, building apps with Bevy ECS has reached a new peak, especially when it comes to scheduling systems. The schedules you want to express, you generally can. And the APIs are more ergonomic, crisp, and consolidated than they have ever been.</p> +<p>Of course there are still plenty of new ECS features on the horizon. Our ECS team is always cooking up something new!</p> +<h3 id="reflection-and-scene-format">Reflection and Scene Format +<a class="anchor-link" href="#reflection-and-scene-format">#</a> +</h3> +<p>Bevy Reflect (Bevy's custom Rust reflection library) is also in a solid spot right now. We've filled in the remaining type system gaps such as <a href="/news/bevy-0-9/#enum-reflection">Enum reflection</a>. We improved our <a href="/news/bevy-0-11/#better-reflect-proxies">Reflect Proxies</a>. We defined a new <a href="/news/bevy-0-11/#stable-typepath">Stable TypePath</a> to give us stability guarantees that Rust's <a href="https://doc.rust-lang.org/std/any/fn.type_name.html">type_name</a> could not (and more features). We made <a href="/news/bevy-0-11/#fromreflect-ergonomics">Reflect derives imply FromReflect</a> to improve the ergonomics of defining Reflected types.</p> +<p>These improvements also fed into our scene system. We defined a <a href="/news/bevy-0-9/#new-scene-format">New Scene Format</a> that is easier to read and compose. We added <a href="/news/bevy-0-11/#resource-support-in-scenes">Resource support to Scenes</a>. And we made it possible to <a href="/news/bevy-0-11/#scene-filtering">filter out Components and Resources from Scenes</a>.</p> +<p>At this point I think the foundations are largely laid. The only things missing at this point are higher level features like &quot;nested scenes&quot; and &quot;property overloading&quot;.</p> +<h3 id="more-real-projectstm-using-bevy">More Real Projects™ Using Bevy +<a class="anchor-link" href="#more-real-projectstm-using-bevy">#</a> +</h3> +<p>Bevy, despite still being &quot;pre 1.0&quot;, continues to be adopted by serious projects. <a href="https://store.steampowered.com/app/2198150/Tiny_Glade/">Tiny Glade</a> is a <a href="https://twitter.com/anastasiaopara/status/1626570875842469888">highly anticipated</a> relaxing free-form building game built using Bevy ECS and Bevy App with a custom renderer. <a href="https://github.com/fishfolk">Fish Folk</a> had a <a href="https://www.kickstarter.com/projects/erlendsh/fish-folk">successfully funded Kickstarter</a> for their bundle of arcade-style multiplayer games (and associated framework) built on top of Bevy. xyzw is building a <a href="https://twitter.com/xyzw_io/status/1677340923292786689">Dwarf-Fortress-like</a> with a beautiful custom 2D lighting system. Anselmo is building a <a href="https://twitter.com/ElmoSampedro/status/1684920884811698176">city builder game set during the industrial revolution</a>.</p> +<p>These join the likes of <a href="https://www.foresightmining.com/">Foresight</a>, <a href="https://noumenal.app/">Noumenal</a>, and <a href="https://store.steampowered.com/app/1792170/Molecoole/">Molecoole</a> from the previous year.</p> +<h3 id="our-maintainers">Our Maintainers +<a class="anchor-link" href="#our-maintainers">#</a> +</h3> +<p>I'm very proud of our Maintainers, who regularly go above and beyond to make Bevy amazing:</p> +<ul> +<li><strong><a href="https://github.com/sponsors/alice-i-cecile">Alice Cecile (@alice-i-cecile)</a></strong> for constantly keeping the PR merge train rolling by reviewing and merging PRs every week. Check out the <a href="https://elk.zone/tech.lgbt/tags/bevymergetrain"><code>#bevymergetrain</code></a> hashtag on Mastodon for an overview of this prolific work (the hashtag is new but the train has been rolling for a long time). And also for helping make ECS Schedule V3 a reality!</li> +<li><strong><a href="https://github.com/sponsors/mockersf">François Mockers (@mockersf)</a></strong> for improving our CI by <a href="/news/bevy-0-11/#new-ci-jobs">orders</a> of <a href="/news/bevy-0-10/#ci-improvements">magnitude</a> this year, and for doing the polyglot job of making sure things &quot;actually work&quot; across most areas of the engine (especially the web platform).</li> +<li><strong><a href="https://github.com/superdump">Rob Swain (@superdump)</a></strong> for being our rendering ring leader: developing new features, helping other renderer developers get things done, and writing long detailed threads about renderer feature design and rationale.</li> +<li><strong><a href="https://github.com/sponsors/james7132">James Liu (@james7132)</a></strong> for <a href="https://github.com/bevyengine/bevy/issues?q=author%3Ajames7132+label%3AC-Performance+">meticulous attention to performance</a>, especially in the ECS area.</li> +</ul> +<p>I am very fortunate to work with such capable people. Bevy would be a very different (and much worse) project without them. Please show your support by <a href="/community/donate/">sponsoring them</a>!</p> +<h2 id="there-is-always-room-for-improvement">There Is Always Room For Improvement +<a class="anchor-link" href="#there-is-always-room-for-improvement">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-third-birthday/improve.svg" alt="improve" /></p> +<h3 id="i-want-to-write-more-of-my-own-code">I Want to Write More (of my own) Code +<a class="anchor-link" href="#i-want-to-write-more-of-my-own-code">#</a> +</h3> +<p>My work on Bevy this last year is characterized by three large areas:</p> +<ol> +<li>Designing and building new &quot;big&quot; things like <a href="https://github.com/bevyengine/bevy/pull/8624">Bevy Asset V2</a>, <a href="https://github.com/bevyengine/bevy/pull/8079">Schedule-First ECS</a>, etc</li> +<li>Helping others design and build things</li> +<li>Running the project: preparing releases, writing blog posts, answering questions, social media, moderating, etc</li> +</ol> +<p>This year I spent <em>a lot</em> of time on (2) and (3). Like most of it. When someone else makes a big (or important) change, I make sure I grok the change in its entirety, carefully consider the design space, build my ideal design in my head, and then &quot;navigate the diff&quot; between that design and the community member's design (either by making the change myself or asking for changes). I was the co-author of 53 pull requests this year (in addition to my own). I spent countless days hashing out designs with other people.</p> +<p>I find myself logging in every day, popping the queue on (2) and (3), and finding that I have less time for (1) than I would like.</p> +<p>Many times I spend significantly more time &quot;navigating the diff between the right design and a community member's design&quot; than it would take me to design and build the thing myself. And most times, this work (while cool and useful) isn't something at the top of my priority list for Bevy (otherwise I would be building it!).</p> +<p>On the one hand, &quot;navigating the diff&quot; is an important investment in the health of the project. This was a very productive year for the Bevy project <em>because</em> we have so many people building things. And we have more and more changes coming in with a &quot;required change diff&quot; that is tiny or non-existent <em>because</em> seasoned developers have helped onboard people to the project and align them with our view for the future.</p> +<p>But I find myself increasingly dissatisfied with the balance I am striking here. I'm here to build an engine. Because I'm good at it and because it brings me happiness. I am not bad at (2) and (3) (in fact, I think I'm pretty good at them), but they do not bring me joy or fulfillment in the same way.</p> +<p>And it is increasingly clear that on their own they don't drive the project forward in the areas we agree need to be driven forward. I am the Project Lead. It is my <em>job</em> (as in the community pays me) to make sure the project is moving forward in the direction we agree it needs to. I will be striking a new balance that allows myself (and others) to more effectively build out the things that the engine needs. Last year I was too &quot;reactive&quot; to whatever shows up in the pull request / message queue.</p> +<p>This year I will spend more time building what needs to be built and less time &quot;doing everything else&quot;. This doesn't mean I will stop reviewing other peoples' code and designs. But I will be much more protective of my &quot;produce outputs in areas that matter the most&quot; time. I will scale out our Maintainer and SME team as necessary to make sure people building cool things outside of &quot;top priority areas&quot; can still make progress.</p> +<h3 id="still-no-editor">Still No Editor +<a class="anchor-link" href="#still-no-editor">#</a> +</h3> +<p>This is disappointing for everyone, including me. It is likely confusing (and annoying) to hear me keep saying <em>we need the Bevy Editor right now</em> and then not deliver it (or even break ground on it). Part of this I attribute to the issues outlined in the previous section. But this is largely due to me failing to accept the truth that it wasn't <em>really</em> my priority. I said &quot;we need the editor now&quot;, then spent the year building Bevy Asset V2, joining the ECS scheduling efforts, and reviewing renderer code. A year <em>feels</em> like a long time when I have a whole one in front of me. I see the amazing things we've accomplished so far and believe we can build anything in a year. But when one elapses it feels <em>so terribly short</em>.</p> +<p>This will change. The Editor <em>is actually my top priority now</em> and I aim to make tangible strides here as soon as possible. This will start with Bevy UI improvements, but I will be developing Editor prototypes in parallel with those improvements to <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">dogfood</a> them. There are also plenty of other people chomping at the bit to do editor work. I will do my best to unblock them and spin up &quot;community editor development&quot; as soon as possible. I will also be much more careful going forward about hyping up new features that aren't directly next on our plate.</p> +<h3 id="funding-bevy-is-confusing">Funding Bevy is Confusing +<a class="anchor-link" href="#funding-bevy-is-confusing">#</a> +</h3> +<p>In the early days, I was the only person meaningfully working on Bevy. It made sense to have the Donate button link directly to my <a href="https://github.com/sponsors/cart">Github Sponsors page</a>. But things have changed! The <a href="/community/people/#the-bevy-organization">Bevy Org</a> is now huge and there are plenty of people spending significant amounts of time making Bevy awesome. This year to help account for that, we made a new <a href="/community/donate/">Donate Page</a> that describes the structure of the Bevy Org and provides a list of people accepting sponsorships. The Donate button now links to this page instead of directly to me.</p> +<p>However this is still suboptimal. How does a company or individual pick who to sponsor? It takes insider knowledge to know where the money would be &quot;best spent&quot;. In the end I'm certain most people will opt for name recognition. And when I am often the public face of the project, that likely often means me. Bevy's funding should not be a popularity contest.</p> +<p>I've also noticed that new sponsorships have gone way down since we moved to this system. I no longer have a global view of sponsorships with this system (I can only see my own), but I strongly suspect that prospective sponsors &quot;bounce off&quot; the complexity of the current system. The old system of &quot;click donate and give money to <code>@cart</code>&quot;, despite its flaws, was at least straightforward.</p> +<p>We need a new system that is:</p> +<ol> +<li><strong>Simple</strong>: People press the donate button, pick a tier, and setup payment. No additional decision making required.</li> +<li><strong>Logical</strong>: We should distribute funds based on the needs of the project, not popularity or randomness.</li> +<li><strong>Centralized</strong>: The Bevy Organization needs a single pool to draw from when directing money to project members.</li> +</ol> +<p>This almost certainly means setting up a legal entity for Bevy (ex: a Bevy Foundation 501(c)(3)). I would like to take notes from the <a href="https://www.blender.org/about/foundation/">Blender Foundation</a> and <a href="https://godot.foundation/">Godot Foundation</a>. I would also like to cut out as many &quot;middle men&quot; crowdfunding platforms / payment processors as I can to make sure donors get the most bang for their buck.</p> +<p>I hear that as of this year 501(c)(3) status is harder to get for software projects, but that doesn't mean we can't try! I would like to have some answer to the funding question by the end of the year.</p> +<h2 id="did-we-learn-from-last-year">Did We Learn From Last Year? +<a class="anchor-link" href="#did-we-learn-from-last-year">#</a> +</h2> +<p>It is important for organizations (and leaders) to learn from their mistakes. Here is my list of &quot;improvement areas&quot; from last year's birthday post, followed by how I think we handled them this year:</p> +<ul> +<li><strong>Bevy 0.6 Took Too long</strong>: Fortunately we learned from this one! No more <em>9 month</em> releases! The train release model we adopted right after <strong>Bevy 0.6</strong> continues to serve us well. <strong>Bevy 0.8</strong> to <strong>0.9</strong> was 3.5 months, <strong>Bevy 0.9</strong> to <strong>0.10</strong> was 3.8 months, and <strong>Bevy 0.10</strong> to <strong>0.11</strong> was 4.2 months. Theres definitely an upward trend that needs some correction though. &quot;3 months plus some buffer&quot; has been getting closer to &quot;4 months plus some buffer&quot;.</li> +<li><strong>Pipelined Rendering Isn't Actually Pipelined Yet</strong>: We did <a href="/news/bevy-0-10/#parallel-pipelined-rendering">enable parallel pipelined rendering</a>!</li> +<li><strong>We Need The Bevy Editor Now!</strong>: Sadly another year went by without a visual Bevy Editor. I discussed the &quot;how&quot; and &quot;why&quot; of this above.</li> +<li><strong>The Rise And Fall of Bevy Merch</strong>: Haha I fortunately did not pick another low-quality merch provider. We still don't have a merch provider though. Sad!</li> +</ul> +<h2 id="can-cart-predict-the-future">Can @cart Predict The Future? +<a class="anchor-link" href="#can-cart-predict-the-future">#</a> +</h2> +<p>In last year's birthday post I <a href="/news/bevys-second-birthday/#the-next-year-of-bevy">made some predictions for the next year</a>. Lets see how I did!</p> +<blockquote> +<p><strong>The Bevy Editor</strong>: This year, we will start experimenting in the &quot;visual scene editing&quot; space. By the end of the year, I would like to have basic scene editing workflows proved out in a &quot;minimum viable product&quot; fashion.</p> +</blockquote> +<p>Sadly another year went by without a visual Bevy Editor. I discussed the &quot;how&quot; and &quot;why&quot; of this above.</p> +<blockquote> +<p><strong>Bevy Assets</strong>: We will add asset preprocessing (optimizing and processing assets at development time, such as precompiling shaders), which is a critical piece of modern gamedev. This will enable faster asset loading, smaller CPU and GPU memory footprints, per-asset import configuration stored in the filesystem, and smaller deployed app sizes.</p> +</blockquote> +<p><a href="https://github.com/bevyengine/bevy/pull/8624">Bevy Asset V2</a> didn't <em>quite</em> land in <a href="/news/bevy-0-11/">Bevy 0.11</a>, but it <em>has</em> entered the final review phase and should land in the <strong>Bevy 0.12</strong> (mid October).</p> +<blockquote> +<p><strong>Bevy UI</strong>: Right now we have a reasonable DOM-like core. This year, we will flesh out what it means to define Bevy UI widgets, improve the ergonomics of defining UI trees, sort out hierarchical UI event handling, and explore higher level dataflow (such as &quot;reactivity&quot;). This will be developed in parallel with the Bevy Editor, which will dogfood Bevy UI and prove out patterns.</p> +</blockquote> +<p>While we did improve Bevy UI in a number of areas, we did not make progress on any of the areas mentioned above. Filling in the gaps in Bevy UI is the first step in my &quot;start building the Editor ASAP&quot; plan. I'm starting work on this <em>tomorrow</em>.</p> +<blockquote> +<p><strong>Bevy Scenes</strong>: Scenes will get a prettier format, support scene nesting, and scene property overloading. These features will be developed in parallel with the Bevy Editor to ensure the experience is cohesive and pleasant.</p> +</blockquote> +<p>Scenes <a href="/news/bevy-0-9/#new-scene-format">did get a prettier format</a>, but we did not add support for scene nesting or property overloading. I'll call this a partial win!</p> +<blockquote> +<p><strong>Bevy ECS</strong>: We will merge &quot;stageless&quot; ECS, making it easier / clearer for systems to depend on changes from other systems and resolving some of the biggest remaining UX issues in Bevy ECS.</p> +</blockquote> +<p>We did in fact merge &quot;stageless&quot; ECS in the form of <a href="/news/bevy-0-10/#ecs-schedule-v3">ECS Schedule V3</a>. Nice!</p> +<blockquote> +<p><strong>The New Bevy Book</strong>: We will replace the current Bevy Book with the New Bevy Book. This will be an iterative process. I care more about opening the doors to community Bevy Book development and building that into our developer culture than achieving specific milestones here. We've put this off for too long.</p> +</blockquote> +<p>We did not replace the Bevy Book with the New Bevy Book. We <em>have</em> however, finally opened the floodgates to contributions and <a href="https://github.com/bevyengine/bevy-website/issues/623#issuecomment-1518887997">developed</a> a <a href="https://github.com/bevyengine/bevy-website/pull/725">drafting process</a>. We have <a href="https://github.com/bevyengine/bevy-website/pull/624">New Book content</a> in the pipeline, which we should hopefully start merging soon. In short: we didn't get nearly as far as I wanted, but the wheels have started turning!</p> +<h2 id="the-next-year-of-bevy">The Next Year of Bevy +<a class="anchor-link" href="#the-next-year-of-bevy">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-third-birthday/next_year.svg" alt="next year" /></p> +<p>I am no longer outlining explicit &quot;plans for the next year&quot;, as I have twice now been pretty bad at making predictions. The Bevy Community and I take a relatively organic and reactive approach to developing Bevy. It doesn't make sense to outline a long list of &quot;plans&quot; when that isn't really how development works in practice.</p> +<p>That being said, here are some of my personal hopes, dreams, and personal priorities for the next year of Bevy.</p> +<ul> +<li><strong>Visual Scene Editor</strong>: With asset system work out of the way, I want to direct my focus toward developing visual scene editing workflows (and polishing up Bevy UI in relevant areas).</li> +<li><strong>Nested Bevy Scenes</strong>: Developers need scene files to be compositional to develop games. And they shouldn't need to drop down to code to compose multiple scenes. We should add nesting to scenes (and look to existing 3rd party Bevy plugins like <a href="https://github.com/MrGVSV/bevy_proto"><code>bevy_proto</code></a> for inspiration).</li> +<li><strong>Landing Bevy Asset V2</strong>: <a href="https://github.com/bevyengine/bevy/pull/8624">Bevy Asset V2</a> has entered the final review phase. We definitely want to land this soon as it will feed into scene-driven workflows and other visual asset editing scenarios.</li> +<li><strong>A Legal Bevy Entity</strong>: As mentioned above, we have reached the point where a legal Bevy entity (such as a Bevy Foundation) is necessary for the health of the project.</li> +</ul> +<p>We have <a href="https://github.com/bevyengine/bevy/pulls">plenty of other work in the pipeline</a>, but I'm keeping this <em>very</em> focused this year to convey my personal priorities.</p> +<p>One last reminder that you should write your own Bevy Birthday blog posts. <a href="https://github.com/bevyengine/bevy-website/issues/728">Submit them here</a>!</p> +<p>If any of this excites you, we would love your help! Check out our code on <a href="https://github.com/bevyengine/bevy">GitHub</a>, start participating in the <a href="/community/">Bevy Community</a>, and consider <a href="/community/donate">sponsoring our work</a> to ensure we can continue building and leading this wildly ambitious project.</p> +<p>I'm looking forward to spending another year building Bevy with you all!</p> +<p>- <a href="https://github.com/cart/">@cart</a></p> +<img src="/assets/bevy_logo_dark.svg" style="height: 4.0rem; margin-top: 1.5rem" /> + + + + Bevy 0.11 + 2023-07-09T00:00:00+00:00 + 2023-07-09T00:00:00+00:00 + + https://bevyengine.org/news/bevy-0-11/ + <p>Thanks to <strong>166</strong> contributors, <strong>522</strong> pull requests, community reviewers, and our <a href="/community/donate"><strong>generous sponsors</strong></a>, we're happy to announce the <strong>Bevy 0.11</strong> release on <a href="https://crates.io/crates/bevy">crates.io</a>!</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out our <a href="/learn/book/getting-started/">Quick Start Guide</a> to try it today. It's free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. Check out <a href="https://bevyengine.org/assets">Bevy Assets</a> for a collection of community-developed plugins, games, and learning resources.</p> +<p>To update an existing Bevy App or Plugin to <strong>Bevy 0.11</strong>, check out our <a href="/learn/migration-guides/0.10-0.11/">0.10 to 0.11 Migration Guide</a>.</p> +<p>Since our last release a few months ago we've added a <em>ton</em> of new features, bug fixes, and quality of life tweaks, but here are some of the highlights:</p> +<span id="continue-reading"></span> +<ul> +<li><strong>Screen Space Ambient Occlusion (SSAO)</strong>: Increase scene render quality by simulating occlusion of &quot;indirect&quot; diffuse light</li> +<li><strong>Temporal Anti-Aliasing (TAA)</strong>: A popular anti-aliasing technique that blends the current frame with past frames using motion vectors to smooth out artifacts</li> +<li><strong>Morph Targets</strong>: Animate vertex positions on meshes between predefined states. Great for things like character customization!</li> +<li><strong>Robust Contrast Adaptive Sharpening (RCAS)</strong>: Intelligently sharpens renders, which pairs nicely with TAA</li> +<li><strong>WebGPU Support</strong>: Bevy can now render on the web faster and with more features using the modern WebGPU web API</li> +<li><strong>Improved Shader Imports</strong>: Bevy shaders now support granular imports and other new features</li> +<li><strong>Parallax Mapping</strong>: Materials now support an optional depth map, giving flat surfaces a feel of depth through parallaxing the material's textures</li> +<li><strong>Schedule-First ECS APIs</strong>: A simpler and more ergonomic ECS system scheduling API</li> +<li><strong>Immediate Mode Gizmo Rendering</strong>: Easily and efficiently render 2D and 3D shapes for debugging and editor scenarios</li> +<li><strong>ECS Audio APIs</strong>: A more intuitive and idiomatic way to play back audio</li> +<li><strong>UI Borders</strong>: UI nodes can now have configurable borders!</li> +<li><strong>Grid UI Layout</strong>: Bevy UI now supports CSS-style grid layout</li> +<li><strong>UI Performance Improvements</strong>: The UI batching algorithm was changed, yielding significant performance wins</li> +</ul> +<h2 id="screen-space-ambient-occlusion">Screen Space Ambient Occlusion +<a class="anchor-link" href="#screen-space-ambient-occlusion">#</a> +</h2> +<div class="release-feature-authors">authors: @JMS55, @danchia, @superdump </div> +<p><b style="display:block; margin-bottom: -18px">Drag this image to compare</b></p> +<div class="image-compare" style="aspect-ratio: 16 / 9" data-title-a="Without SSAO" data-title-b="With SSAO"> + <img class="image-a" alt="Without SSAO" src="no_ssao.png"> + <img class="image-b" alt="With SSAO" src="with_ssao.png"> +</div> +<p><strong>SSAO Only</strong> +<img src="https://bevyengine.org/news/bevy-0-11/ssao_only.png" alt="ssao_only" /></p> +<p>Bevy now supports Screen Space Ambient Occlusion (SSAO). While Bevy already supported shadows from direct lights +(<a href="https://docs.rs/bevy/0.11.0/bevy/pbr/struct.DirectionalLight.html"><code>DirectionalLight</code></a>, <a href="https://docs.rs/bevy/0.11.0/bevy/pbr/struct.PointLight.html"><code>PointLight</code></a>, <a href="https://docs.rs/bevy/0.11.0/bevy/pbr/struct.SpotLight.html"><code>SpotLight</code></a>) via shadow mapping, Bevy now supports shadows from <em>indirect</em> diffuse lighting such as <a href="https://docs.rs/bevy/0.11.0/bevy/pbr/struct.AmbientLight.html"><code>AmbientLight</code></a> or <a href="https://docs.rs/bevy/0.11.0/bevy/pbr/struct.EnvironmentMapLight.html"><code>EnvironmentMapLight</code></a>.</p> +<p>These shadows give scenes a more &quot;grounded&quot; feel, by estimating how much surrounding geometry blocks incoming light via the screen-space depth and normal prepasses. You can try it out in the new <a href="https://github.com/bevyengine/bevy/blob/v0.11.0/examples/3d/ssao.rs">SSAO example</a>.</p> +<p>Note that using SSAO with the newly added Temporal Anti-Aliasing leads to a <em>large</em> increase in quality and noise reduction.</p> +<p>Platform support is currently limited - Only Vulkan, DirectX12, and Metal are currently supported. WebGPU support will come at a later date. WebGL likely won't be supported because it doesn't have compute shaders.</p> +<p>Special thanks to Intel for their open source <a href="https://github.com/GameTechDev/XeGTAO">XeGTAO</a> project, which was a huge help in developing this feature.</p> +<h2 id="temporal-anti-aliasing">Temporal Anti-Aliasing +<a class="anchor-link" href="#temporal-anti-aliasing">#</a> +</h2> +<div class="release-feature-authors">authors: @JMS55, @DGriffin91</div> +<p><img src="https://bevyengine.org/news/bevy-0-11/aa.png" alt="aa" /></p> +<p>Alongside MSAA and FXAA, Bevy now supports Temporal Anti-aliasing (TAA) as an anti-aliasing option.</p> +<p>TAA works by blending the newly rendered frame with past frames in order to smooth out aliasing artifacts in the image. TAA has become increasingly popular in the industry because of its ability to cover up so many rendering artifacts: it smooths out shadows (both global illumination and &quot;casted&quot; shadows), mesh edges, textures, and reduces specular aliasing of light on reflective surfaces. However because the &quot;smoothing&quot; effect is so apparent, some people prefer other methods.</p> +<p>Here's a quick rundown of the following advantages and disadvantages of each anti-aliasing method that Bevy supports:</p> +<ul> +<li><strong>Multi-Sample Antialiasing (MSAA)</strong> +<ul> +<li>Does a good job at smoothing the edges of meshes (anti geometric aliasing). Does not help with specular aliasing. Performance cost scales with triangle count, and performs very poorly on scenes with many triangles</li> +</ul> +</li> +<li><strong>Fast Approximate Antialiasing (FXAA)</strong> +<ul> +<li>Does a decent job of dealing with both geometric and specular aliasing. Very little performance cost in all scenes. Somewhat blurry and low quality results</li> +</ul> +</li> +<li><strong>Temporal Antialiasing (TAA)</strong> +<ul> +<li>Does a very good job at dealing with both geometric and specular aliasing. Does a good job at dealing with temporal aliasing, where high-frequency details flicker over time or as you move the camera around or as things animate. Performance cost is moderate, and scales only with screen resolution. Chance of &quot;ghosting&quot; where meshes or lighting effects may leave trails behind them that fade over time. Although TAA helps with reducing temporal aliasing, it may also introduce additional temporal aliasing, especially on thin geometry or texture detail rendered at a distance. Requires 2 view's worth of additional GPU memory, as well as enabling the motion vector and depth prepasses. Requires accurate motion vector and depth prepasses, which complicates custom materials</li> +</ul> +</li> +</ul> +<p>TAA implementations are a series of tradeoffs and rely on heuristics that are easy to get wrong. In Bevy 0.11, TAA is marked as an experimental feature for the following reasons:</p> +<ul> +<li>TAA does not currently work with the following Bevy features: skinning, morph targets, and parallax mapping</li> +<li>TAA currently tends to soften the image a bit, which can be worked around via post-process sharpening</li> +<li>Our TAA heuristics are not currently user-configurable (and these heuristics are likely to change and evolve)</li> +</ul> +<p>We will continue to improve quality, compatibility, and performance in future releases. Please report any bugs you encounter!</p> +<p>You can compare all of our anti-aliasing methods in Bevy's improved <a href="https://github.com/bevyengine/bevy/blob/v0.11.0/examples/3d/anti_aliasing.rs">anti-aliasing example</a>.</p> +<h2 id="robust-contrast-adaptive-sharpening">Robust Contrast Adaptive Sharpening +<a class="anchor-link" href="#robust-contrast-adaptive-sharpening">#</a> +</h2> +<div class="release-feature-authors">authors: @Elabajaba</div> +<p>Effects like TAA and FXAA can cause the final render to become blurry. Sharpening post processing effects can help counteract that. In <strong>Bevy 0.11</strong> we've added a port of AMD's Robust Constrast Adaptive Sharpening (RCAS).</p> +<p><b style="display:block; margin-bottom: -18px">Drag this image to compare</b></p> +<div class="image-compare" style="aspect-ratio: 16 / 9" data-title-a="TAA" data-title-b="TAA+RCAS"> + <img class="image-a" alt="TAA" src="rcas_off.png"> + <img class="image-b" alt="TAA+RCAS" src="rcas_on.png"> +</div> +<p>Notice that the texture on the leather part of the helmet is much crisper!</p> +<h2 id="morph-targets">Morph Targets +<a class="anchor-link" href="#morph-targets">#</a> +</h2> +<div class="release-feature-authors">authors: @nicopap, @cart</div> +<p>Bevy, since the 0.7 release, supports 3D animations.</p> +<p>But it only supported <em>skeletal</em> animations. Leaving on the sidewalk a common +animation type called <em>morph targets</em> (aka blendshapes, aka keyshapes, and a slew +of other names). This is the grandparent of all 3D character animation! +<a href="https://en.wikipedia.org/wiki/Crash_Bandicoot_(video_game)#Gameplay">Crash Bandicoot</a>'s run cycle used morph targets.</p> +<p><video controls><source src="morph_targets_video.mp4" type="video/mp4"/></video></p> +<div style="font-size: 1.0rem" class="release-feature-authors">Character model by <a href="https://www.artstation.com/zambrah">Samuel Rosario</a> (© all rights reserved), used with permission. Modified by nicopap, using the <a href="https://studio.blender.org/characters/snow/v2/">Snow</a> character texture by Demeter Dzadik for Blender Studios <a href="https://creativecommons.org/licenses/by/4.0/">(🅯 CC-BY)</a>. +</div> +<!-- The previous paragraph requires the <a href> tags, since zola doesn't +process markdown markup within tags --> +<p>Nowadays, an animation artist will typically use a skeleton rig for wide +moves and morph targets to clean up the detailed movements.</p> +<p>When it comes to game assets, however, the complex skeleton rigs used by +artists for faces and hands are too heavy. Usually, the poses are +&quot;baked&quot; into morph poses, and facial expression transitions are handled +in the engine through morph targets.</p> +<p>Morph targets is a very simple animation method. Take a model, have a base +vertex position, move the vertices around to create several poses:</p> +<div style="flex-direction:row;display:flex;justify-content:space-evenly"> +<div style="display:flex;flex-direction:column;align-items:center;width:20%"><p><b>Default</b></p><img alt="A wireframe rendering of a character's face with a neutral expression" src="default-pose-bw.png"></div> +<div style="display:flex;flex-direction:column;align-items:center;width:20%"><p><b>Frown</b></p><img alt="Wireframe rendering of a frowning character" src="frown-pose-bw.png"></div> +<div style="display:flex;flex-direction:column;align-items:center;width:20%"><p><b>Smirk</b></p><img alt="Wireframe rendering of a smirking character" src="smirk-pose-bw.png"></div> +</div> +<p>Store those poses as a difference between the default base mesh and the variant +pose, then, at runtime, <em>mix</em> each pose. Now that we have the difference with +the base mesh, we can get the variant pose by simply adding to the base +vertices positions.</p> +<p>That's it, the morph target shader looks like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">morph_vertex</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">vertex</span><span class="z-punctuation z-separator z-rust">:</span> Vertex</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>var i<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">u32</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> 0u<span class="z-punctuation z-terminator z-rust">;</span> i <span class="z-keyword z-operator z-comparison z-rust">&lt;</span> <span class="z-support z-function z-rust">pose_count</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> i<span class="z-keyword z-operator z-arithmetic z-rust">+</span><span class="z-keyword z-operator z-arithmetic z-rust">+</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> weight <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-function z-rust">weight_for_pose</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>i</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + vertex<span class="z-punctuation z-accessor z-dot z-rust">.</span>position <span class="z-keyword z-operator z-assignment z-rust">+=</span> weight <span class="z-keyword z-operator z-arithmetic z-rust">*</span> <span class="z-support z-function z-rust">get_difference</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>vertex<span class="z-punctuation z-accessor z-dot z-rust">.</span>index<span class="z-punctuation z-separator z-rust">,</span> position_offset<span class="z-punctuation z-separator z-rust">,</span> i</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + vertex<span class="z-punctuation z-accessor z-dot z-rust">.</span>normal <span class="z-keyword z-operator z-assignment z-rust">+=</span> weight <span class="z-keyword z-operator z-arithmetic z-rust">*</span> <span class="z-support z-function z-rust">get_difference</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>vertex<span class="z-punctuation z-accessor z-dot z-rust">.</span>index<span class="z-punctuation z-separator z-rust">,</span> normal_offset<span class="z-punctuation z-separator z-rust">,</span> i</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>In Bevy, we store the weights per pose in the <code>MorphWeights</code> component.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">set_weights_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">morph_weights</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> MorphWeights<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> entity_weights <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> morph_weights <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> weights <span class="z-keyword z-operator z-assignment z-rust">=</span> entity_weights<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">weights_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + weights<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span><span class="z-punctuation z-terminator z-rust">;</span> + weights<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">25</span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Now assuming that we have two morph targets, (1) the frown pose, (2) +the smirk pose:</p> +<div style="flex-direction:row;display:flex;justify-content:space-evenly"> +<div style="display:flex;flex-direction:column;align-items:center;width:12%"> + <p><b>[0.0, 0.0]</b></p> + <p style="margin:0;font-size:75%">default pose</p> + <img alt="Neutral face expression" src="morph_target_default-0.png"> +</div> +<div style="display:flex;flex-direction:column;align-items:center;width:12%"> + <p><b>[1.0, 0.0]</b></p> + <p style="margin:0;font-size:75%">frown only</p> + <img alt="Frowning" src="morph_target_frown-0.png"> +</div> +<div style="display:flex;flex-direction:column;align-items:center;width:12%"> + <p><b>[0.0, 1.0]</b></p> + <p style="margin:0;font-size:75%">smirk only</p> + <img alt="Smirking" src="morph_target_smirk.png"> +</div> +<div style="display:flex;flex-direction:column;align-items:center;width:12%"> + <p><b>[0.5, 0.0]</b></p> + <p style="margin:0;font-size:75%">half frown</p> + <img alt="Slightly frowning" src="morph_target_frown-half-0.png"> +</div> +<div style="display:flex;flex-direction:column;align-items:center;width:12%"> + <p><b>[1.0, 1.0]</b></p> + <p style="margin:0;font-size:75%">both at max</p> + <img alt="Making faces" src="morph_target_both-0.png"> +</div> +<div style="display:flex;flex-direction:column;align-items:center;width:12%"> + <p><b>[0.5, 0.25]</b></p> + <p style="margin:0;font-size:75%">bit of both</p> + <img alt="Slightly frowning/smirking" src="morph_target_smirk-quarter-frown-half-0.png"> +</div> +</div> +<p>While conceptually simple, it requires communicating to the GPU a tremendous +amount of data. Thousand of vertices, each 288 bits, several model variations, +sometimes a hundred.</p> +<p>We store the vertex data as pixels in a 3D texture. This allows morph targets to not only +run on WebGPU, but also on the WebGL2 wgpu backend.</p> +<p>This could be improved in a number of ways, but it is sufficient for an +initial implementation.</p> +<p><video controls><source src="morph_target_smirk.mp4" type="video/mp4"/></video></p> +<h2 id="parallax-mapping">Parallax Mapping +<a class="anchor-link" href="#parallax-mapping">#</a> +</h2> +<div class="release-feature-authors">author: @nicopap</div> +<p>Bevy now supports parallax mapping and depth maps. Parallax mapping puts normal +maps to shame when it comes to giving &quot;illusion of depth&quot; to a material. The top half of this video uses parallax mapping plus a normal map, whereas the bottom half only uses a normal map:</p> +<p><video controls loop><source alt="a rotating view of the earth, the top half of the screen uses parallax mapping, while the bottom half does not" src="earth-parallax.mp4" type="video/mp4"/></video></p> +<div style="font-size: 1.0rem" class="release-feature-authors">earth view, elevation & night view by NASA (public domain)</div> +<p>Notice how it is not merely the shading of pixels that changes, but their +actual position on screen. The mountaintops hide mountain ridges behind +themselves. High mountains move faster than coastal areas.</p> +<p>Parallax mapping moves pixels according to the perspective and depth on the +surface of the geometry. Adding true 3D depth to flat surfaces.</p> +<p>All of that, without adding a single vertex to the geometry. The whole globe +has exactly 648 vertices. Unlike a more primitive shader, such as displacement +mapping, parallax mapping only requires an additional grayscale image, called +the <code>depth_map</code>.</p> +<p>Games often use parallax mapping for cobblestones or brick walls, so +let's make a brick wall in Bevy! First, we spawn a mesh:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PbrBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + mesh<span class="z-punctuation z-separator z-rust">:</span> meshes<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">shape<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">Box<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">30.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>StandardMaterial <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + base_color<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">WHITE</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><img src="https://bevyengine.org/news/bevy-0-11/parallax_mapping_none_mini.jpg" alt="A 3D desert scene with two flat white walls and a pebble path winding between them" /></p> +<p>Of course, it's just a flat white box, we didn't add any texture. +So let's add a normal map:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">normal_map_texture<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>assets<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>normal_map.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span></code></pre> +<p><img src="https://bevyengine.org/news/bevy-0-11/parallax_mapping_normals_mini.jpg" alt="The same scene with normal maps" /></p> +<p>This is much better. The shading changes according to the light direction too! +However, the specular highlights on the corner are overbearing, almost noisy.</p> +<p>Let's see how a depth map can help:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">depth_map<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>assets<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>depth_map.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span></code></pre> +<p><img src="https://bevyengine.org/news/bevy-0-11/parallax_mapping_depth_mini.jpg" alt="The same scene with a depth texture" /></p> +<p>We eliminated the noise! There is also that sweet 3D feel reminiscent of +90's games pre-rendered cinematic sequences.</p> +<p>So what's going on, why does parallax mapping eliminate the ugly specular +lights on the wall?</p> +<p>This is because parallax mapping insets the ridges between bricks, so that they +are occluded by the bricks themselves.</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/ridge-light-view-1.svg" alt="Illustration of the previous paragraph" /></p> +<p>Since normal maps do not &quot;move&quot; the shaded areas, merely shade them +differently, we get those awkward specular highlights. With parallax mapping, +they are gone.</p> +<p><b style="display:block; margin-bottom: -18px">Drag this image to compare</b></p> +<div class="image-compare" style="aspect-ratio: 16 / 9; --slider-value: 39%" data-title-a="Normals Only" data-title-b="Parallax+Normals"> + <img class="image-a" alt="Normal Mapping Only" src="parallax_mapping_normals.jpg"> + <img class="image-b" alt="Parallax & Normal Mapping" src="parallax_mapping_depth.jpg"> +</div> +<p>Parallax mapping in Bevy is still very limited. The most painful aspect is that +it is not a standard glTF feature, meaning that the depth texture needs to be +programmatically added to materials if they came from a GLTF file.</p> +<p>Additionally, parallax mapping is incompatible with the temporal antialiasing +shader, doesn't work well on curved surfaces, and doesn't affect object's +silhouettes.</p> +<p>However, those are not fundamental limitations of parallax mapping, and may be +fixed in the future.</p> +<h2 id="skyboxes">Skyboxes +<a class="anchor-link" href="#skyboxes">#</a> +</h2> +<div class="release-feature-authors">authors: @JMS55, @superdump</div> +<p><img src="https://bevyengine.org/news/bevy-0-11/skybox.png" alt="skybox" /></p> +<p>Bevy now has built-in support for displaying an HDRI environment as your scene background.</p> +<p>Simply attach the new <a href="https://docs.rs/bevy/0.11.0/bevy/core_pipeline/struct.Skybox.html"><code>Skybox</code></a> component to your <a href="https://docs.rs/bevy/0.11.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a>. It pairs well with the existing <a href="https://docs.rs/bevy/0.11.0/bevy/pbr/struct.EnvironmentMapLight.html"><code>EnvironmentMapLight</code></a>, which will use the environment map to light the scene.</p> +<p>We also plan to add support for built-in procedural skyboxes sometime in the future!</p> +<h2 id="webgpu-support">WebGPU Support +<a class="anchor-link" href="#webgpu-support">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf, many others throughout Bevy's development</div> +<p><img src="https://bevyengine.org/news/bevy-0-11/webgpu.svg" alt="webgpu" /></p> +<p>Bevy now supports WebGPU rendering on the web (in addition to WebGL 2). WebGPU support is still rolling out, but if you have <a href="https://caniuse.com/webgpu">a supported web browser</a> you can explore our new <a href="/examples-webgpu">live WebGPU examples</a> page.</p> +<h3 id="what-is-webgpu">What is WebGPU? +<a class="anchor-link" href="#what-is-webgpu">#</a> +</h3> +<p>WebGPU is an <a href="https://github.com/gpuweb/gpuweb">exciting new web standard</a> for doing modern GPU graphics and compute. It takes inspiration from Vulkan, Direct3D 12, and Metal. In fact, it is generally implemented on top of these APIs under the hood. WebGPU gives us access to more GPU features than WebGL2 (such as compute shaders) and also has the potential to be much faster. It means that more of Bevy's native renderer features are now also available on the web. It also uses the new <a href="https://www.w3.org/TR/WGSL">WGSL shader language</a>. We're very happy with how WGSL has evolved over time and Bevy uses it internally for our shaders. We also added usability features like imports! But with Bevy you still have the option to use GLSL if you prefer.</p> +<h3 id="how-it-works">How it Works +<a class="anchor-link" href="#how-it-works">#</a> +</h3> +<p>Bevy is built on top of the <a href="https://github.com/gfx-rs/wgpu">wgpu</a> library, which is a modern low-level GPU API that can target pretty much every popular API: Vulkan, Direct3D 12, Metal, OpenGL, WebGL2, and WebGPU. The best backend API is selected for a given platform. It is a &quot;native&quot; rendering API, but it generally follows the WebGPU terminology and API design. Unlike WebGPU, it can provide direct access to the native APIs, which means Bevy <a href="/news/bevy-webgpu/#how-it-works">enjoys a &quot;best of all worlds&quot; situation</a>.</p> +<h3 id="webgpu-examples">WebGPU Examples +<a class="anchor-link" href="#webgpu-examples">#</a> +</h3> +<p>Click one of the images below to check out our live WebGPU examples (if your <a href="https://caniuse.com/webgpu">browser supports it</a>):</p> +<p><a href="/examples-webgpu"><img src="https://bevyengine.org/news/bevy-0-11/webgpu_examples.png" alt="webgpu examples" /></a></p> +<h2 id="improved-shader-imports">Improved Shader Imports +<a class="anchor-link" href="#improved-shader-imports">#</a> +</h2> +<div class="release-feature-authors">authors: @robtfm</div> +<p>Bevy's rendering engine has a lot of great options and features. For example, the PBR <code>StandardMaterial</code> pipeline supports desktop/webgpu and webgl, 6 optional mesh attributes, 4 optional textures, and a plethora of optional features like fog, skinning, and alpha blending modes, with more coming in every release.</p> +<p>Many feature combos need specialized shader variants, and with over 3000 lines of shader code split over 50 files in total, the text-substitution-based shader processor was beginning to creak at the seams.</p> +<p>This release we've switched to using <a href="https://github.com/bevyengine/naga_oil">naga_oil</a>, which gives us a module-based shader framework. It compiles each file individually to naga's IR and then combines them into a final shader on demand. This doesn't have much visible impact yet, but it does give a few immediate benefits:</p> +<ul> +<li>The engine's shader code is easier to navigate and less magical. Previously there was only a single global scope, so items could be referenced even if they were only imported indirectly. This sometimes made it hard to locate the actual code behind the reference. Now items must be explicitly imported, so you can always tell where a variable or function originated just by looking at the current file: <br/> +<img src="https://bevyengine.org/news/bevy-0-11/imported_items.png" alt="imported items" /></li> +<li>Shaders now have codespan reporting, an error will point you to the shader file and line number, preventing a lot of hair pulling in complex shader codebases: <br/> +<img src="https://bevyengine.org/news/bevy-0-11/codespan.png" alt="codespan" /></li> +<li>naga_oil's preprocessor supports a few more conditional directives, you can use <code>#else if</code> and <code>#else ifndef</code> as well as <code>#else ifdef</code> which was previously supported</li> +<li>Functions, variables and structs are all properly scoped so a shader file doesn't need to use globally unique names to avoid conflicts</li> +<li>Shader defs can be added to modules directly. For example, any shader that imports <code>bevy_pbr::mesh_view_types</code> now has <code>MAX_DIRECTIONAL_LIGHTS</code> automatically defined, there's no longer a need to remember to add it for every new pipeline that uses the module.</li> +</ul> +<p>The future possibilities are more exciting. Using naga IR opens the door to a bunch of nice features that we hope to bring in future releases:</p> +<ul> +<li>Automatic bind slot allocation will let plugins extend the core view bindgroup, which means self-contained plugins for features like lighting and shadow methods, common material properties, etc become viable. This will allow us to modularise the core pipelines to make growing the codebase - while keeping support for multiple targets - more sustainable</li> +<li>&quot;Virtual&quot; shader functions will allow user modifications to core functions (like lighting), and potentially lead to a template-style material system, where users can provide &quot;hooks&quot; that will be called at the right point in the pipeline</li> +<li>Language interop: mix and match glsl and wgsl, so bevy's pbr pipeline features could be accessed from your glsl material shader, or utils written for glsl could be used in wgsl code. We're hopeful that this can extend to spirv (and rust-gpu) as well</li> +<li>More cool stuff we haven't thought of yet. Being able to inspect and modify shaders at runtime is very powerful and makes a lot of things possible!</li> +</ul> +<h2 id="ui-node-borders">UI Node Borders +<a class="anchor-link" href="#ui-node-borders">#</a> +</h2> +<div class="release-feature-authors">authors: @ickshonpe</div> +<p>UI nodes now draws borders, whose color can be configured with the new <a href="https://docs.rs/bevy/0.11.0/bevy/ui/struct.BorderColor.html"><code>BorderColor</code></a> component:</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/borders.png" alt="borders" /></p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>ButtonBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + style<span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + border<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">UiRect<span class="z-punctuation z-accessor z-rust">::</span></span>all<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">5.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + border_color<span class="z-punctuation z-separator z-rust">:</span> BorderColor<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">9</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">9</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">9</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Each side of the border is configurable:</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/border-sides.png" alt="border sides" /></p> +<h2 id="grid-ui-layout">Grid UI Layout +<a class="anchor-link" href="#grid-ui-layout">#</a> +</h2> +<div class="release-feature-authors">authors: @nicoburns</div> +<p>In Bevy UI we wired up the new <code>grid</code> feature in the layout library we use (<a href="https://github.com/DioxusLabs/taffy">Taffy</a>). This enables CSS-style grid layouts:</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/grid.png" alt="grid" /></p> +<p>This can be configured on the <a href="https://docs.rs/bevy/0.11.0/bevy/ui/struct.Style.html"><code>Style</code></a> component:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Use grid layout for this node +</span> display<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Display<span class="z-punctuation z-accessor z-rust">::</span></span>Grid<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Make the grid have a 1:1 aspect ratio +</span> <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> This means the width will adjust to match the height +</span> aspect_ratio<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Add 24px of padding around the grid +</span> padding<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">UiRect<span class="z-punctuation z-accessor z-rust">::</span></span>all<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">24.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Set the grid to have 4 columns all with sizes minmax(0, 1fr) +</span> <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> This creates 4 exactly evenly sized columns +</span> grid_template_columns<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">RepeatedGridTrack<span class="z-punctuation z-accessor z-rust">::</span></span>flex<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">4</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Set the grid to have 4 rows all with sizes minmax(0, 1fr) +</span> <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> This creates 4 exactly evenly sized rows +</span> grid_template_rows<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">RepeatedGridTrack<span class="z-punctuation z-accessor z-rust">::</span></span>flex<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">4</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Set a 12px gap/gutter between rows and columns +</span> row_gap<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">12.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + column_gap<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">12.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span></code></pre> +<h2 id="schedule-first-ecs-apis">Schedule-First ECS APIs +<a class="anchor-link" href="#schedule-first-ecs-apis">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>In <strong>Bevy 0.10</strong> we introduced <a href="/news/bevy-0-10/#ecs-schedule-v3">ECS Schedule V3</a>, which <em>vastly</em> improved the capabilities of Bevy ECS system scheduling: scheduler API ergonomics, system chaining, the ability to run exclusive systems and apply deferred system operations at any point in a schedule, a single unified schedule, configurable System Sets, run conditions, and a better State system.</p> +<p>However it pretty quickly became clear that the new system still had some areas to improve:</p> +<ul> +<li><strong>Base Sets were hard to understand and error prone</strong>: What <em>is</em> a Base Set? When do I use them? Why do they exist? Why is my ordering implicitly invalid due to incompatible Base Set ordering? Why do some schedules have a default Base Set while others don't? <a href="https://github.com/bevyengine/bevy/pull/8079#base-set-confusion">Base Sets were confusing!</a></li> +<li><strong>There were too many ways to schedule a System</strong>: We've accumulated too many scheduling APIs. As of Bevy <strong>0.10</strong>, we had <a href="https://github.com/bevyengine/bevy/pull/8079#unify-system-apis"><em>SIX</em> different ways to add a system to the &quot;startup&quot; schedule</a>. Thats too many ways!</li> +<li><strong>Too much implicit configuration</strong>: There were both default Schedules and default Base Sets. In some cases systems had default schedules or default base sets, but in other cases they didn't! <a href="https://github.com/bevyengine/bevy/pull/8079#schedule-should-be-clear">A system's schedule and configuration should be explicit and clear</a>.</li> +<li><strong>Adding Systems to Schedules wasn't ergonomic</strong>: Things like <code>add_system(foo.in_schedule(CoreSchedule::Startup))</code> were not fun to type or read. We created special-case helpers, such as <code>add_startup_system(foo)</code>, but <a href="https://github.com/bevyengine/bevy/pull/8079#ergonomic-system-adding">this required more internal code, user-defined schedules didn't benefit from the special casing, and it completely hid the <code>CoreSchedule::Startup</code> symbol!</a>.</li> +</ul> +<h3 id="unraveling-the-complexity">Unraveling the Complexity +<a class="anchor-link" href="#unraveling-the-complexity">#</a> +</h3> +<p>If your eyes started to glaze over as you tried to wrap your head around this, or phrases like &quot;implicitly added to the <code>CoreSet::Update</code> Base Set&quot; filled you with dread ... don't worry. After <a href="https://github.com/bevyengine/bevy/pull/8079">a lot of careful thought</a> we've unraveled the complexity and built something clear and simple.</p> +<p>In <strong>Bevy 0.11</strong> the &quot;scheduling mental model&quot; is <em>much</em> simpler thanks to <strong>Schedule-First ECS APIs</strong>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Startup<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Update<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>c<span class="z-punctuation z-separator z-rust">,</span> d<span class="z-punctuation z-separator z-rust">,</span> e</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>FixedUpdate<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>f<span class="z-punctuation z-separator z-rust">,</span> g</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PostUpdate<span class="z-punctuation z-separator z-rust">,</span> h</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>OnEnter<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> enter_menu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>OnExit<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> exit_menu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<ul> +<li><strong>There is <em>exactly</em> one way to schedule systems</strong> +<ul> +<li>Call <code>add_systems</code>, state the schedule name, and specify one or more systems</li> +</ul> +</li> +<li><strong>Base Sets have been entirely removed in favor of Schedules, which have friendly / short names</strong> +<ul> +<li>Ex: The <code>CoreSet::Update</code> Base Set has become <code>Update</code></li> +</ul> +</li> +<li><strong>There is no implicit or implied configuration</strong> +<ul> +<li>Default Schedules and default Base Sets don't exist</li> +</ul> +</li> +<li><strong>The syntax is easy on the eyes and ergonomic</strong> +<ul> +<li>Schedules are first so they &quot;line up&quot; when formatted</li> +</ul> +</li> +</ul> +<details> + <summary>To compare, expand this to see what it used to be!</summary> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Startup system variant 1. +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Has an implied default StartupSet::Startup base set +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Has an implied CoreSchedule::Startup schedule +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_startup_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Startup system variant 2. +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Has an implied default StartupSet::Startup base set +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Has an implied CoreSchedule::Startup schedule +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">on_startup</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Startup system variant 3. +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Has an implied default StartupSet::Startup base set +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">CoreSchedule<span class="z-punctuation z-accessor z-rust">::</span></span>Startup</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Update system variant 1. +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> `CoreSet::Update` base set and `CoreSchedule::Main` are implied +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>c</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Update system variant 2 (note the add_system vs add_systems difference) +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> `CoreSet::Update` base set and `CoreSchedule::Main` are implied +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>d<span class="z-punctuation z-separator z-rust">,</span> e</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> No implied default base set because CoreSchedule::FixedUpdate doesn&#39;t have one +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>f<span class="z-punctuation z-separator z-rust">,</span> g</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">CoreSchedule<span class="z-punctuation z-accessor z-rust">::</span></span>FixedUpdate</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> `CoreSchedule::Main` is implied, in_base_set overrides the default CoreSet::Update set +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>h<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_base_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">CoreSet<span class="z-punctuation z-accessor z-rust">::</span></span>PostUpdate</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This has no implied default base set +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>enter_menu<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>OnEnter<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This has no implied default base set +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>exit_menu<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>OnExit<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +</details> +<p>Note that normal &quot;system sets&quot; still exist! You can still use sets to organize and order your systems:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Update<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>walk<span class="z-punctuation z-separator z-rust">,</span> jump</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Movement</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + collide<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Movement</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>The <code>configure_set</code> API has also been adjusted for parity:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Bevy 0.10 +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">configure_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Bar</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PostUpdate</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Bevy 0.11 +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">configure_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PostUpdate<span class="z-punctuation z-separator z-rust">,</span> Foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Bar</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h2 id="nested-system-tuples-and-chaining">Nested System Tuples and Chaining +<a class="anchor-link" href="#nested-system-tuples-and-chaining">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>It is now possible to infinitely nest tuples of systems in a <code>.add_systems</code> call!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Update<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-separator z-rust">,</span> c<span class="z-punctuation z-separator z-rust">,</span> d<span class="z-punctuation z-separator z-rust">,</span> e</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> f</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>g<span class="z-punctuation z-separator z-rust">,</span> h</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + i +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>At first glance, this might not seem very useful. But in combination with per-tuple configuration, it allows you to easily and cleanly express schedules:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Update<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>attack<span class="z-punctuation z-separator z-rust">,</span> defend</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Combat</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">before</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>check_health</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + check_health<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>handle_death<span class="z-punctuation z-separator z-rust">,</span> respawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>check_health</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p><code>.chain()</code> has also been adapted to support arbitrary nesting! The ordering in the example above could be rephrased like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Update<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>attack<span class="z-punctuation z-separator z-rust">,</span> defend</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Combat</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + check_health<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>handle_death<span class="z-punctuation z-separator z-rust">,</span> respawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">chain</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This will run <code>attack</code> and <code>defend</code> first (in parallel), then <code>check_health</code>, then <code>handle_death</code> and <code>respawn</code> (in parallel).</p> +<p>This allows for powerful and expressive &quot;graph-like&quot; ordering expressions:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Update<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-separator z-rust">,</span> c<span class="z-punctuation z-separator z-rust">,</span> d</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">chain</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>e<span class="z-punctuation z-separator z-rust">,</span> f</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">chain</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This will run <code>a</code> in parallel with <code>b-&gt;c-&gt;d</code>, then after those have finished running it will run <code>e</code> and <code>f</code> in parallel.</p> +<h2 id="gizmos">Gizmos +<a class="anchor-link" href="#gizmos">#</a> +</h2> +<div class="release-feature-authors">authors: @devil-ira, @mtsr, @aevyrie, @jannik4, @lassade, @The5-1, @Toqozz, @nicopap</div> +<p>It is often helpful to be able to draw simple shapes and lines in 2D and 3D for things like editor controls, and debug views. Game development is a very &quot;spatial&quot; thing and being able to quickly draw shapes is the visual equivalent of &quot;print line debugging&quot;. It helps answer questions like &quot;is this ray casting in the right direction?&quot; and &quot;is this collider big enough?&quot;</p> +<p>In <strong>Bevy 0.11</strong> we've added an &quot;immediate mode&quot; <a href="https://docs.rs/bevy/0.11.0/bevy/gizmos/gizmos/struct.Gizmos.html"><code>Gizmos</code></a> drawing API that makes these things easy and efficient. In 2D and 3D you can draw lines, rects, circles, arcs, spheres, cubes, line strips, and more!</p> +<p><strong>2D Gizmos</strong> +<img src="https://bevyengine.org/news/bevy-0-11/2d_gizmos.png" alt="2d gizmos" /> +<strong>3D Gizmos</strong> +<img src="https://bevyengine.org/news/bevy-0-11/3d_gizmos.png" alt="3d gizmos" /></p> +<p>From any system you can spawn shapes into existence (for both 2D and 3D):</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">gizmos</span><span class="z-punctuation z-separator z-rust">:</span> Gizmos</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> 2D +</span> gizmos<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">line_2d</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Vec2<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Vec2<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">10.</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">RED</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + gizmos<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">circle_2d</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Vec2<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">40.</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">BLUE</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> 3D +</span> gizmos<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">circle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Vec3<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">ZERO</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Vec3<span class="z-punctuation z-accessor z-rust">::</span></span>Y<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">3.</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">BLACK</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + gizmos<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">ray</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Vec3<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Vec3<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">5.</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">5.</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">5.</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">BLUE</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + gizmos<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">sphere</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Vec3<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">ZERO</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Quat<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">IDENTITY</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">3.</span><span class="z-constant z-numeric z-float z-rust">2</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">BLACK</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Because the API is &quot;immediate mode&quot;, gizmos will only be drawn on frames where they are &quot;queued up&quot;, which means you don't need to worry about cleaning up gizmo state!</p> +<p>Gizmos are drawn in batches, which means they are very cheap. You can have hundreds of thousands of them!</p> +<h2 id="ecs-audio-apis">ECS Audio APIs +<a class="anchor-link" href="#ecs-audio-apis">#</a> +</h2> +<div class="release-feature-authors">authors: @inodentry</div> +<p>Bevy's audio playback APIs have been reworked to integrate more cleanly with Bevy's ECS.</p> +<p>In previous versions of Bevy you would play back audio like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Resource</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyMusic</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">sink</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AudioSink<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">play_music</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, + <span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">audio</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Audio<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">audio_sinks</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AudioSink<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> weak_handle <span class="z-keyword z-operator z-assignment z-rust">=</span> audio<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>my_music.ogg<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-storage z-type z-rust">let</span> strong_handle <span class="z-keyword z-operator z-assignment z-rust">=</span> audio_sinks<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>weak_handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MyMusic <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + sink<span class="z-punctuation z-separator z-rust">:</span> strong_handle<span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>That is a lot of boilerplate just to play a sound! Then to adjust playback you would access the <a href="https://docs.rs/bevy/0.11.0/bevy/audio/struct.AudioSink.html"><code>AudioSink</code></a> like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"> +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">pause_music</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">my_music</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyMusic<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">audio_sinks</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AudioSink<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>sink</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> audio_sinks<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>my_music<span class="z-punctuation z-accessor z-dot z-rust">.</span>sink</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">pause</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Treating audio playback as a resource created a number of problems and notably didn't play well with things like Bevy Scenes. In <strong>Bevy 0.11</strong>, audio playback is represented as an <a href="https://docs.rs/bevy/0.11.0/bevy/ecs/entity/struct.Entity.html"><code>Entity</code></a> with <a href="https://docs.rs/bevy/0.11.0/bevy/audio/type.AudioBundle.html"><code>AudioBundle</code></a> components:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyMusic</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">play_music</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, <span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + AudioBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + source<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>my_music.ogg<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + MyMusic<span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>The <code>mode</code> field in the <a href="https://docs.rs/bevy/0.11.0/bevy/audio/struct.PlaybackSettings.html"><code>PlaybackSettings</code></a> struct offers a straightforward way to manage the lifecycle of these audio entities.</p> +<p>By passing a <a href="https://docs.rs/bevy/0.11.0/bevy/audio/enum.PlaybackMode.html"><code>PlaybackMode</code></a>, you are able to choose whether it plays once or repeatedly, using <code>Once</code> and <code>Loop</code> respectively. If you anticipate that the audio might be played again, you can save resources by temporarily unloading it using <code>Despawn</code>, or free up its memory immediately if it is a one-time effect using <code>Remove</code>.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">AudioBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + source<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>hit_sound.ogg<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + settings<span class="z-punctuation z-separator z-rust">:</span> PlaybackSettings <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + mode<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">PlaybackMode<span class="z-punctuation z-accessor z-rust">::</span></span>Despawn<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>Much simpler! To adjust playback you can query for the <a href="https://docs.rs/bevy/0.11.0/bevy/audio/struct.AudioSink.html"><code>AudioSink</code></a> component:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">pause_music</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query_music</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>AudioSink, <span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyMusic<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Ok</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>sink</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_single</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">pause</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="global-audio-volume">Global Audio Volume +<a class="anchor-link" href="#global-audio-volume">#</a> +</h2> +<div class="release-feature-authors">authors: @mrchantey</div> +<p>Bevy now has a global volume level which can be configured via the [<code>GlobalVolume</code>] resource:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">GlobalVolume<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">2</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="resource-support-in-scenes">Resource Support in Scenes +<a class="anchor-link" href="#resource-support-in-scenes">#</a> +</h2> +<div class="release-feature-authors">authors: @Carbonhell, @Davier</div> +<p>Bevy's scene format is a very useful tool for serializing and deserializing game state to and from scene files.</p> +<p>Previously, the captured state was limited to only entities and their components. +With <strong>Bevy 0.11</strong>, scenes now support serializing resources as well.</p> +<p>This adds a new <code>resources</code> field to the scene format:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + resources<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>my_game::stats::TotalScore<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + score<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">9001</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + entities<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Entity scene data... +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h2 id="scene-filtering">Scene Filtering +<a class="anchor-link" href="#scene-filtering">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>When serializing data to a scene, all components and <a href="https://bevyengine.org/news/bevy-0-11/#resource-support-in-scenes">resources</a> are serialized by default. +In previous versions, you had to use the given <code>TypeRegistry</code> to act as a filter, leaving out the types you don't want included.</p> +<p>In 0.11, there's now a dedicated <code>SceneFilter</code> type to make filtering easier, cleaner, and more intuitive. +This can be used with <a href="https://docs.rs/bevy/0.11.0/bevy/prelude/struct.DynamicSceneBuilder.html"><code>DynamicSceneBuilder</code></a> to have fine-grained control over what actually gets serialized.</p> +<p>We can <code>allow</code> a subset of types:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> builder <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">DynamicSceneBuilder<span class="z-punctuation z-accessor z-rust">::</span></span>from_world<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> scene <span class="z-keyword z-operator z-assignment z-rust">=</span> builder + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">allow<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ComponentA<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">allow<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ComponentB<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">extract_entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">build</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Or <code>deny</code> them:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> builder <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">DynamicSceneBuilder<span class="z-punctuation z-accessor z-rust">::</span></span>from_world<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> scene <span class="z-keyword z-operator z-assignment z-rust">=</span> builder + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">deny<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ComponentA<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">deny<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ComponentB<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">extract_entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">build</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="default-font">Default Font +<a class="anchor-link" href="#default-font">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>Bevy now supports a configurable default font and embeds a tiny default font (a minimal version of <a href="https://fonts.google.com/specimen/Fira+Mono">Fira Mono</a>). This is useful if you use a common font throughout your project. And it makes it easier to prototype new changes with a &quot;placeholder font&quot; without worrying about setting it on each node.</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/default_font.png" alt="default font" /></p> +<h2 id="ui-texture-atlas-support">UI Texture Atlas Support +<a class="anchor-link" href="#ui-texture-atlas-support">#</a> +</h2> +<div class="release-feature-authors">authors: @mwbryant</div> +<p>Previously UI <code>ImageBundle</code> Nodes could only use handles to full images without an ergonomic way to use <code>TextureAtlases</code> in UI. In this release we add support for an <code>AtlasImageBundle</code> UI Node which brings the existing <code>TextureAtlas</code> support into UI.</p> +<p>This was achieved by merging the existing mechanisms that allows text rendering to select which glyph to use and the mechanisms that allow for <code>TextureAtlasSprite</code>.</p> +<p><video controls><source src="texture_atlas_ui.mp4" type="video/mp4"/></video></p> +<h2 id="gamepad-rumble-api">Gamepad Rumble API +<a class="anchor-link" href="#gamepad-rumble-api">#</a> +</h2> +<div class="release-feature-authors">authors: @johanhelsing, @nicopap</div> +<p>You can now use the <code>EventWriter&lt;GamepadRumbleRequest&gt;</code> system parameter to +trigger controllers force-feedback motors.</p> +<p><a href="https://crates.io/crates/gilrs"><code>gilrs</code></a>, the crate Bevy uses for gamepad support, allows controlling +force-feedback motors. Sadly, there were no easy way of accessing the +force-feedback API in Bevy without tedious bookkeeping.</p> +<p>Now Bevy has the <code>GamepadRumbleRequest</code> event to do just that.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">rumble_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-variable z-parameter z-rust">gamepads</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Gamepads<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">rumble_requests</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">EventWriter<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>GamepadRumbleRequest<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> gamepad <span class="z-keyword z-operator z-rust">in</span> gamepads<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + rumble_requests<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">send</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">GamepadRumbleRequest<span class="z-punctuation z-accessor z-rust">::</span></span>Add <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + gamepad<span class="z-punctuation z-separator z-rust">,</span> + duration<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Duration<span class="z-punctuation z-accessor z-rust">::</span></span>from_secs<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">5</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + intensity<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">GamepadRumbleIntensity<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">MAX</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>The <code>GamepadRumbleRequest::Add</code> event triggers a force-feedback motor, +controlling how long the vibration should last, the motor to activate, +and the vibration strength. <code>GamepadRumbleRequest::Stop</code> immediately stops all motors.</p> +<h2 id="new-default-tonemapping-method">New Default Tonemapping Method +<a class="anchor-link" href="#new-default-tonemapping-method">#</a> +</h2> +<div class="release-feature-authors">authors: @JMS55</div> +<p>In <strong>Bevy 0.10</strong> we <a href="/news/bevy-0-10/#more-tonemapping-choices">made tonemapping configurable with a ton of new tonemapping options</a>. In <strong>Bevy 0.11</strong> we've switched the default tonemapping method from &quot;Reinhard luminance&quot; tonemapping to &quot;TonyMcMapface&quot;:</p> +<p><b style="display:block; margin-bottom: -18px">Drag this image to compare</b></p> +<div class="image-compare" style="aspect-ratio: 16 / 9" data-title-a="Reinhard-luminance" data-title-b="TonyMcMapface"> + <img class="image-a" alt="Reinhard-luminance" src="tm_reinhard_luminance.png"> + <img class="image-b" alt="TonyMcMapface" src="tm_tonymcmapface.png"> +</div> +<p>TonyMcMapface (<a href="https://github.com/h3r2tic/tony-mc-mapface">created by Tomasz Stachowiak</a>) is a much more neutral display transform that tries to stay as close to the input &quot;light&quot; as possible. This helps retain artistic choices in the scene. Notably, brights desaturate across the entire spectrum (unlike Reinhard luminance). It also works much better with bloom when compared to Reinhard luminance.</p> +<h2 id="entityref-queries">EntityRef Queries +<a class="anchor-link" href="#entityref-queries">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132</div> +<p><a href="https://docs.rs/bevy/0.11.0/bevy/ecs/world/struct.EntityRef.html"><code>EntityRef</code></a> now implements <a href="https://docs.rs/bevy/0.11.0/bevy/ecs/query/trait.WorldQuery.html"><code>WorldQuery</code></a>, which makes it easier to query for arbitrary components in your ECS systems:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>EntityRef<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> entity <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>query <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>mesh</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> entity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Mesh<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> transform <span class="z-keyword z-operator z-assignment z-rust">=</span> entity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Note that <a href="https://docs.rs/bevy/0.11.0/bevy/ecs/world/struct.EntityRef.html"><code>EntityRef</code></a> queries access every entity and every component in the entire <a href="https://docs.rs/bevy/0.11.0/bevy/ecs/world/struct.World.html"><code>World</code></a> by default. This means that they will conflict with any &quot;mutable&quot; query:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> These queries will conflict, making this system invalid +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>EntityRef<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">enemies</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Enemy<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>To resolve conflicts (or reduce the number of entities accessed), you can add filters:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> These queries will not conflict +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>EntityRef, <span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">enemies</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Enemy, <span class="z-meta z-generic z-rust">Without<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> only iterates players +</span> <span class="z-keyword z-control z-rust">for</span> entity <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>players <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>mesh</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> entity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Mesh<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> transform <span class="z-keyword z-operator z-assignment z-rust">=</span> entity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Note that it will generally still be more ergonomic (and more efficient) to query for the components you want directly:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Mesh<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span>, <span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>transform<span class="z-punctuation z-separator z-rust">,</span> mesh</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>players <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="screenshot-api">Screenshot API +<a class="anchor-link" href="#screenshot-api">#</a> +</h2> +<div class="release-feature-authors">authors: @TheRawMeatball</div> +<p>Bevy now has a simple screenshot API that can save a screenshot of a given window to the disk:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">take_screenshot</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">screenshot_manager</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ScreenshotManager<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">input</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Input<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>KeyCode<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">primary_window</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Entity, <span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>PrimaryWindow<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> input<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">just_pressed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">KeyCode<span class="z-punctuation z-accessor z-rust">::</span></span>Space</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + screenshot_manager + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">save_screenshot_to_disk</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>primary_window<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">single</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>screenshot.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="rendertarget-textureview">RenderTarget::TextureView +<a class="anchor-link" href="#rendertarget-textureview">#</a> +</h2> +<div class="release-feature-authors">authors: @mrchantey</div> +<p>The <a href="https://docs.rs/bevy/0.11.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a> <a href="https://docs.rs/bevy/0.11.0/bevy/render/camera/enum.RenderTarget.html"><code>RenderTarget</code></a> can now be set to a wgpu <a href="https://docs.rs/bevy/0.11.0/bevy/render/render_resource/struct.TextureView.html"><code>TextureView</code></a>. This allows 3rd party Bevy Plugins to manage a <a href="https://docs.rs/bevy/0.11.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a>'s texture. One particularly interesting use case that this enables is XR/VR support. A few community members have already <a href="https://github.com/bevyengine/bevy/issues/115#issuecomment-1436749201">proven this out!</a></p> +<h2 id="improved-text-wrapping">Improved Text Wrapping +<a class="anchor-link" href="#improved-text-wrapping">#</a> +</h2> +<div class="release-feature-authors">authors: @ickshonpe</div> +<p>Previous versions of Bevy didn't properly wrap text because it calculated the actual text prior to calculating layout. <strong>Bevy 0.11</strong> adds a &quot;text measurement step&quot; that calculates the text size prior to layout, then computes the actual text <em>after</em> layout.</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/text_wrap.png" alt="text wrap" /></p> +<p>There is also a new <code>NoWrap</code> variant on the <a href="https://docs.rs/bevy/0.11.0/bevy/text/enum.BreakLineOn.html"><code>BreakLineOn</code></a> setting, which can disable text wrapping entirely when that is desirable.</p> +<h2 id="faster-ui-render-batching">Faster UI Render Batching +<a class="anchor-link" href="#faster-ui-render-batching">#</a> +</h2> +<div class="release-feature-authors">authors: @ickshonpe</div> +<p>We got a huge UI performance win for some cases by avoiding breaking up UI batches when the texture changes but the next node is untextured.</p> +<p>Here is a profile of our &quot;many buttons&quot; stress test. Red is before the optimization and Yellow is after:</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/ui_profile.png" alt="ui profile" /></p> +<h2 id="better-reflect-proxies">Better Reflect Proxies +<a class="anchor-link" href="#better-reflect-proxies">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>Bevy's reflection API has a handful of structs which are collectively known as &quot;dynamic&quot; types. +These include <a href="https://docs.rs/bevy/0.11.0/bevy/reflect/struct.DynamicStruct.html"><code>DynamicStruct</code></a>, <a href="https://docs.rs/bevy/0.11.0/bevy/reflect/struct.DynamicTuple.html"><code>DynamicTuple</code></a>, and more, and they are used to dynamically construct types +of any shape or form at runtime. +These types are also used to create are commonly referred to as &quot;proxies&quot;, which are dynamic types +that are used to represent an actual concrete type.</p> +<p>These proxies are what powers the <a href="https://docs.rs/bevy/0.11.0/bevy/reflect/trait.Reflect.html#tymethod.clone_value"><code>Reflect::clone_value</code></a> method, which generates these proxies under the hood +in order to construct a runtime clone of the data.</p> +<p>Unfortunately, this results in a few <a href="https://github.com/bevyengine/bevy/issues/6601">subtle footguns</a> that could catch users by surprise, +such as the hashes of proxies differing from the hashes of the concrete type they represent, +proxies not being considered equivalent to their concrete counterparts, and more.</p> +<p>While this release does not necessarily fix these issues, it does establish a solid foundation for fixing them in the future. +The way it does this is by changing how a proxy is defined.</p> +<p>Before 0.11, a proxy was only defined by cloning the concrete type's <a href="https://docs.rs/bevy/0.11.0/bevy/reflect/trait.Reflect.html#tymethod.type_name"><code>Reflect::type_name</code></a> string +and returning it as its own <code>Reflect::type_name</code>.</p> +<p>Now in 0.11, a proxy is defined by copying a reference to the static <a href="https://docs.rs/bevy/0.11.0/bevy/reflect/enum.TypeInfo.html"><code>TypeInfo</code></a> of the concrete type. +This will allow us to access more of the concrete type's type information dynamically, without requiring the <code>TypeRegistry</code>. +In a <a href="https://github.com/bevyengine/bevy/pull/8695">future release</a>, we will make use of this to store hashing and comparison strategies in the <code>TypeInfo</code> directly +in order to mitigate the proxy issues mentioned above.</p> +<h2 id="fromreflect-ergonomics"><code>FromReflect</code> Ergonomics +<a class="anchor-link" href="#fromreflect-ergonomics">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>Bevy's <a href="https://docs.rs/bevy_reflect/latest/bevy_reflect/index.html">reflection API</a> commonly passes around data using type-erased <code>dyn Reflect</code> trait objects. +This can usually be downcast back to its concrete type using <code>&lt;dyn Reflect&gt;::downcast_ref::&lt;T&gt;</code>; +however, this doesn't work if the underlying data has been converted to a &quot;dynamic&quot; representation +(e.g. <code>DynamicStruct</code> for struct types, <code>DynamicList</code> for list types, etc.).</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> data<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">i32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">3</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-storage z-type z-rust">let</span> reflect<span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>dyn Reflect <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>data<span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> cloned<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn Reflect<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> reflect<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone_value</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> `reflect` really is a `Vec&lt;i32&gt;` +</span><span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>reflect<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">is<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">i32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>reflect<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">represents<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">i32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> `cloned` is a `DynamicList`, but represents a `Vec&lt;i32&gt;` +</span><span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>cloned<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">is<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>DynamicList<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>cloned<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">represents<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">i32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> `cloned` is equivalent to the original `reflect`, despite not being a `Vec&lt;i32&gt;` +</span><span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>cloned<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">reflect_partial_eq</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>reflect</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap_or_default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>To account for this, the <a href="https://docs.rs/bevy_reflect/latest/bevy_reflect/trait.FromReflect.html"><code>FromReflect</code></a> trait can be used to convert any <code>dyn Reflect</code> trait object +back into its concrete type— whether it is actually that type or a dynamic representation of it. +And it can even be called dynamically using the <a href="https://docs.rs/bevy_reflect/latest/bevy_reflect/struct.ReflectFromReflect.html"><code>ReflectFromReflect</code></a> type data.</p> +<p>Before 0.11, users had to be manually derive <code>FromReflect</code> for every type that needed it, +as well as manually register the <code>ReflectFromReflect</code> type data. +This made it cumbersome to use and also meant that it was often forgotten about, +resulting in reflection conversions difficulties for users downstream.</p> +<p>Now in 0.11, <code>FromReflect</code> is automatically derived and <code>ReflectFromReflect</code> is automatically registered for all types that derive <code>Reflect</code>. +This means most types will be <code>FromReflect</code>-capable by default, +thus reducing boilerplate and empowering logic centered around <code>FromReflect</code>.</p> +<p>Users can still opt out of this behavior by adding the <a href="https://docs.rs/bevy_reflect/latest/bevy_reflect/derive.Reflect.html#reflectfrom_reflect--false"><code>#[reflect(from_reflect = false)]</code></a> attribute to their type.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Foo</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">reflect</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">from_reflect <span class="z-keyword z-operator z-rust">=</span> false</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Bar</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">test</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>T<span class="z-punctuation z-separator z-rust">:</span> FromReflect<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">value</span><span class="z-punctuation z-separator z-rust">:</span> T</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-support z-function z-rust">test</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Foo</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> &lt;-- OK! +</span><span class="z-support z-function z-rust">test</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Bar</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> &lt;-- ERROR! `Bar` does not implement trait `FromReflect` +</span></span></code></pre> +<h2 id="deref-derive-attribute">Deref Derive Attribute +<a class="anchor-link" href="#deref-derive-attribute">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>Bevy code tends to make heavy use of the <a href="https://doc.rust-lang.org/rust-by-example/generics/new_types.html">newtype</a> pattern, +which is why we have dedicated derives for <a href="https://docs.rs/bevy/latest/bevy/prelude/derive.Deref.html"><code>Deref</code></a> and <a href="https://docs.rs/bevy/latest/bevy/prelude/derive.DerefMut.html"><code>DerefMut</code></a>.</p> +<p>This previously only worked for structs with a single field:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Resource<span class="z-punctuation z-separator z-rust">,</span> Deref<span class="z-punctuation z-separator z-rust">,</span> DerefMut</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Score</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">i32</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>For 0.11, we've improved these derives by adding the <code>#[deref]</code> attribute, which allows them to be used on structs with multiple fields. +This makes working with generic newtypes much easier:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component<span class="z-punctuation z-separator z-rust">,</span> Deref<span class="z-punctuation z-separator z-rust">,</span> DerefMut</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-generic z-rust"><span class="z-entity z-name z-struct z-rust">Health</span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>T<span class="z-punctuation z-separator z-rust">:</span> Character<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span></span><span class="z-meta z-struct z-rust"> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">deref</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> &lt;- use the `health` field as the `Deref` and `DerefMut` target +</span> <span class="z-variable z-other z-member z-rust">health</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">u16</span>, + <span class="z-variable z-other z-member z-rust">_character_type</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">PhantomData<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>T<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="simpler-rendergraph-construction">Simpler RenderGraph Construction +<a class="anchor-link" href="#simpler-rendergraph-construction">#</a> +</h2> +<div class="release-feature-authors">authors: @IceSentry, @cart</div> +<p>Adding <code>Node</code>s to the <code>RenderGraph</code> requires a lot of boilerplate. In this release, we tried to reduce this for most common operations. No existing APIs have been removed, these are only helpers made to simplify working with the <code>RenderGraph</code>.</p> +<p>We added the <code>RenderGraphApp</code> trait to the <code>App</code>. This trait contains various helper functions to reduce the boilerplate with adding nodes and edges to a graph.</p> +<p>Another pain point of <code>RenderGraph</code> <code>Node</code>s is passing the view entity through each node and manually updating the query on that view. To fix this we added a <code>ViewNode</code> trait and <code>ViewNodeRunner</code> that will automatically take care of running the <code>Query</code> on the view entity. We also made the view entity a first-class concept of the <code>RenderGraph</code>. So you can now access the view entity the graph is currently running on from anywhere in the graph without passing it around between each <code>Node</code>.</p> +<p>All these new APIs assume that your Node implements <code>FromWorld</code> or <code>Default</code>.</p> +<p>Here's what it looks like in practice for the <code>BloomNode</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Adding the node to the 3d graph +</span>render_app + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> To run a ViewNode you need to create a ViewNodeRunner +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">add_render_graph_node<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">ViewNodeRunner<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>BloomNode<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-constant z-other z-rust">CORE_3D</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">core_3d<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">graph<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">node<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">BLOOM</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Defining the node +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Default</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">BloomNode</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This can replace your `impl Node` block of any existing `Node` that operated on a view +</span><span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">ViewNode <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">BloomNode</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> You need to define your view query as an associated type +</span> <span class="z-storage z-type z-type z-rust">type</span> <span class="z-entity z-name z-type z-rust">ViewQuery</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;static</span> ExtractedCamera<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;static</span> ViewTarget<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;static</span> BloomSettings<span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> You don&#39;t need Node::input() or Node::update() anymore. If you still need these they are still available but they have an empty default implementation. +</span> <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">run</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-variable z-parameter z-rust">self</span>, + <span class="z-variable z-parameter z-rust">graph</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> RenderGraphContext, + <span class="z-variable z-parameter z-rust">render_context</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> RenderContext, + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This is the result of your query. If it is empty the run function will not be called +</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-variable z-parameter z-rust">camera</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-variable z-parameter z-rust">view_target</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-variable z-parameter z-rust">bloom_settings</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span>: <span class="z-meta z-generic z-rust">QueryItem<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-path z-rust"><span class="z-storage z-type z-rust"><span class="z-storage z-type z-rust">Self</span><span class="z-punctuation z-accessor z-rust">::</span></span></span>ViewQuery<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>World, + </span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Result</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-punctuation z-section z-group z-end z-rust">)</span>, NodeRunError<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> When using the ViewNode you probably won&#39;t need the view entity but here&#39;s how to get it if you do +</span> <span class="z-storage z-type z-rust">let</span> view_entity <span class="z-keyword z-operator z-assignment z-rust">=</span> graph<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">view_entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Run the node +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="reflect-default-on-enum-variant-fields"><code>#[reflect(default)]</code> on Enum Variant Fields +<a class="anchor-link" href="#reflect-default-on-enum-variant-fields">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>When using the <code>FromReflect</code> trait, fields marked <code>#[reflect(default)]</code> will be set to their <code>Default</code> value if they don't exist on the reflected object.</p> +<p>Previously, this was only supported on struct fields. +Now, it is also supported on all enum variant fields.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">MyEnum</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + Data <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">reflect</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">default</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + a<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-separator z-rust">,</span> + b<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> data <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">DynamicStruct<span class="z-punctuation z-accessor z-rust">::</span></span>default <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +data<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>b<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-storage z-type z-rust">let</span> dynamic_enum <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">DynamicEnum<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Data<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> data</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-storage z-type z-rust">let</span> my_enum <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">MyEnum<span class="z-punctuation z-accessor z-rust">::</span></span>from_reflect<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span> dynamic_enum</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">u32</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> my_enum<span class="z-punctuation z-accessor z-dot z-rust">.</span>a</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="delayed-asset-hot-reloading">Delayed Asset Hot Reloading +<a class="anchor-link" href="#delayed-asset-hot-reloading">#</a> +</h2> +<div class="release-feature-authors">authors: @JMS55</div> +<p>Bevy now waits 50 milliseconds after an &quot;asset changed on filesystem&quot; event before reloading an asset. Reloading without a delay resulted in reading invalid asset contents on some systems. The wait time is configurable.</p> +<h2 id="custom-gltf-vertex-attributes">Custom glTF Vertex Attributes +<a class="anchor-link" href="#custom-gltf-vertex-attributes">#</a> +</h2> +<div class="release-feature-authors">authors: @komadori</div> +<p>It is now possible to load meshes with custom vertex attributes from glTF files. Custom attributes can be mapped to Bevy's <a href="https://docs.rs/bevy/0.11.0/bevy/render/mesh/struct.MeshVertexAttribute.html"><code>MeshVertexAttribute</code></a> format used by the <a href="https://docs.rs/bevy/0.11.0/bevy/render/mesh/struct.Mesh.html"><code>Mesh</code></a> type in the <a href="https://docs.rs/bevy/0.11.0/bevy/gltf/struct.GltfPlugin.html"><code>GltfPlugin</code></a> settings. These attrtibutes can then be used in Bevy shaders. For an example, check out our <a href="https://github.com/bevyengine/bevy/blob/v0.11.0/examples/2d/custom_gltf_vertex_attribute.rs">new example</a>.</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/custom_vertex.png" alt="custom vertex attribute" /></p> +<h2 id="stable-typepath">Stable TypePath +<a class="anchor-link" href="#stable-typepath">#</a> +</h2> +<div class="release-feature-authors">authors: @soqb, @tguichaoua</div> +<p>Bevy has historically used <a href="https://doc.rust-lang.org/std/any/fn.type_name.html"><code>std::any::type_name</code></a> to identify Rust types with friendly names in a number of places: Bevy Reflect, Bevy Scenes, Bevy Assets, Bevy ECS, and others. Unfortunately, Rust makes no guarantees about the stability or format of <a href="https://doc.rust-lang.org/std/any/fn.type_name.html"><code>type_name</code></a>, which makes it theoretically shakey ground to build on (although in practice it has been stable so far).</p> +<p>There is also no built in way to retrieve &quot;parts&quot; of a type name. If you want the short name, the name of a generic type without its inner types, the module name, or the crate name, you must do string operations on the <a href="https://doc.rust-lang.org/std/any/fn.type_name.html"><code>type_name</code></a> (which can be error prone / nontrivial).</p> +<p>Additionally, <a href="https://doc.rust-lang.org/std/any/fn.type_name.html"><code>type_name</code></a> cannot be customized. In some cases an author might choose to identify a type with something other than its full module path (ex: if they prefer a shorter path or want to abstract out private / internal modules).</p> +<p>For these reasons, we've developed a new stable <a href="https://docs.rs/bevy/0.11.0/bevy/reflect/trait.TypePath.html"><code>TypePath</code></a>, which is automatically implemented for any type deriving <a href="https://docs.rs/bevy/0.11.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a>. Additionally, it can be manually derived in cases where <a href="https://docs.rs/bevy/0.11.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> isn't derived.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-module z-rust"><span class="z-storage z-type z-module z-rust">mod</span> <span class="z-entity z-name z-module z-rust">my_mod</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyType</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> prints: &quot;my_crate::my_mod::MyType&quot; +</span><span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">MyType<span class="z-punctuation z-accessor z-rust">::</span></span>type_path<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> prints: &quot;MyType&quot; +</span><span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">MyType<span class="z-punctuation z-accessor z-rust">::</span></span>short_type_path<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> prints: &quot;my_crate&quot; +</span><span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">MyType<span class="z-punctuation z-accessor z-rust">::</span></span>crate_name<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> prints: &quot;my_crate::my_mod&quot; +</span><span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">MyType<span class="z-punctuation z-accessor z-rust">::</span></span>module_path<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This also works for generics, which can come in handy:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> prints: &quot;Option&lt;MyType&gt;&quot; +</span><span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-type z-rust">Option</span><span class="z-punctuation z-separator z-rust">:</span><span class="z-punctuation z-separator z-rust">:</span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyType<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>short_type_path<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> prints: &quot;Option&quot; +</span><span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-type z-rust">Option</span><span class="z-punctuation z-separator z-rust">:</span><span class="z-punctuation z-separator z-rust">:</span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyType<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>type_ident<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><a href="https://docs.rs/bevy/0.11.0/bevy/reflect/trait.TypePath.html"><code>TypePath</code></a> can be customized by type authors:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">TypePath</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">type_path</span> <span class="z-keyword z-operator z-rust">=</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>some_crate::some_module<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyType</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>We are in the process of porting Bevy's internal <a href="https://doc.rust-lang.org/std/any/fn.type_name.html"><code>type_name</code></a> usage over to <a href="https://docs.rs/bevy/0.11.0/bevy/reflect/trait.TypePath.html"><code>TypePath</code></a>, which should land in <strong>Bevy 0.12</strong>.</p> +<h2 id="run-if-for-tuples-of-systems"><code>run_if</code> for Tuples of Systems +<a class="anchor-link" href="#run-if-for-tuples-of-systems">#</a> +</h2> +<div class="release-feature-authors">authors: @geieredgar</div> +<p>It is now possible to add <a href="/news/bevy-0-10/#run-conditions">&quot;run conditions&quot;</a> to tuples of systems:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Update<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>run<span class="z-punctuation z-separator z-rust">,</span> jump</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run_if</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-support z-function z-rust">in_state</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">GameState<span class="z-punctuation z-accessor z-rust">::</span></span>Playing</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This will evaluate the &quot;run condition&quot; exactly once and use the result for each system in the tuple.</p> +<p>This allowed us to remove the <code>OnUpdate</code> system set for states (which was previously used to run groups of systems when they are in a given state).</p> +<h2 id="has-queries"><code>Has</code> Queries +<a class="anchor-link" href="#has-queries">#</a> +</h2> +<div class="release-feature-authors">authors: @wainwrightmark</div> +<p>You can now use <code>Has&lt;Component&gt;</code> in queries, which will return true if that component exists and false if it does not:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Has<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> has_player <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>query <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> has_player <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="derive-event">Derive <code>Event</code> +<a class="anchor-link" href="#derive-event">#</a> +</h2> +<div class="release-feature-authors">authors: @CatThingy</div> +<p>The Bevy <a href="https://docs.rs/bevy/0.11.0/bevy/ecs/event/trait.Event.html"><code>Event</code></a> trait is now derived instead of being auto-impled for everything:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Event</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Collision</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">a</span><span class="z-punctuation z-separator z-type z-rust">:</span> Entity, + <span class="z-variable z-other z-member z-rust">b</span><span class="z-punctuation z-separator z-type z-rust">:</span> Entity, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>This prevents some classes of error, makes <a href="https://docs.rs/bevy/0.11.0/bevy/ecs/event/trait.Event.html"><code>Event</code></a> types more self-documenting, and provides consistency with other Bevy ECS traits like Components and Resources. It also opens the doors to configuring the <a href="https://docs.rs/bevy/0.11.0/bevy/ecs/event/trait.Event.html"><code>Event</code></a> storage type, which we plan to do in future releases.</p> +<h2 id="cubic-curve-example">Cubic Curve Example +<a class="anchor-link" href="#cubic-curve-example">#</a> +</h2> +<div class="release-feature-authors">authors: @Kjolnyr</div> +<p>An example that shows how to draw a 3D curve and move an object along the path:</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/cubic_curve.png" alt="cubic_curve" /></p> +<h2 id="size-constraints-example">Size Constraints Example +<a class="anchor-link" href="#size-constraints-example">#</a> +</h2> +<div class="release-feature-authors">authors: @ickshonpe</div> +<p>An interactive example that shows how the various <a href="https://docs.rs/bevy/0.11.0/bevy/ui/struct.Style.html"><code>Style</code></a> size constraints affect UI nodes.</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/size_constraints.png" alt="size constraints" /></p> +<h2 id="display-and-visibility-example">Display and Visibility Example +<a class="anchor-link" href="#display-and-visibility-example">#</a> +</h2> +<div class="release-feature-authors">authors: @ickshonpe</div> +<p>An example that shows how display and visibility settings affect UI nodes.</p> +<p><img src="https://bevyengine.org/news/bevy-0-11/display_and_visibility.png" alt="display and visibiltiy" /></p> +<h2 id="no-more-bors">No More Bors! +<a class="anchor-link" href="#no-more-bors">#</a> +</h2> +<div class="release-feature-authors">authors: @cart, @mockersf</div> +<p>Bevy has historically used the Bors merge system to ensure we never merge a pull request on GitHub that breaks our CI validation. This was a critical piece of infrastructure that ensured we could collaborate safely and effectively. Fortunately GitHub has <em>finally</em> rolled out <a href="https://github.blog/changelog/2023-02-08-pull-request-merge-queue-public-beta/">Merge Queues</a>, which solve the same problems as Bors, with the benefit of being more tightly integrated with GitHub.</p> +<p>For this release cycle we migrated to Merge Queues and we're very happy with the experience!</p> +<h2 id="new-ci-jobs">New CI Jobs +<a class="anchor-link" href="#new-ci-jobs">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>We've added a number of new CI jobs that improve the Bevy development experience:</p> +<ul> +<li>A daily job that runs Bevy's mobile examples on real Android and iOS devices! This helps protect against regressions that might not be caught by the compiler</li> +<li>Added the ability to take screenshots in CI, which can be used to validate the results of Bevy example runs</li> +<li>A job that leaves a GitHub comment on PRs that are missing a feature or example doc update</li> +</ul> +<h2 id="what-s-next"><a name="what-s-next"></a>What's Next? +<a class="anchor-link" href="#what-s-next">#</a> +</h2> +<p>We have plenty of work that is pretty much finished and is therefore very likely to land in <strong>Bevy 0.12</strong>:</p> +<ul> +<li><strong>Bevy Asset V2</strong>: A brand new asset system that adds &quot;asset preprocessing&quot;, optional asset .meta files, recursive asset dependency tracking and events, async asset IO, better asset handles, more efficient asset storage, and a variety of usability improvements! The work here is <a href="https://github.com/bevyengine/bevy/pull/8624">pretty much finished</a>. It <em>almost</em> made it in to Bevy 0.11 but it needed a bit more time to cook.</li> +<li><strong>PBR Material Light Transmission</strong>: Transmission / screen space refractions allows for simulating materials like glass, plastics, liquids and gels, gemstones, wax, etc. This one is also pretty much <a href="https://github.com/bevyengine/bevy/pull/8015">ready to go</a>!</li> +<li><strong>TAA Improvements</strong>: We have a number of changes in the works for TAA that will improve its quality, speed, and support within the engine.</li> +<li><strong>GPU Picking</strong>: Efficiently and correctly <a href="https://github.com/bevyengine/bevy/pull/8784">select entities on the GPU</a> by using color ids to identify meshes in renders.</li> +<li><strong>PCF For Directional and Spotlight Shadows</strong>: <a href="https://github.com/bevyengine/bevy/pull/8006">Reduce aliasing on the edges of shadows</a></li> +<li><strong>UI Node Border Radius and Shadows</strong>: Add <a href="https://github.com/bevyengine/bevy/pull/8973">curvature and &quot;drop shadows&quot;</a> to your UI nodes!</li> +<li><strong>Deferred Rendering</strong>: Bevy already does &quot;mixed mode&quot; forward rendering by having optional separate passes for depth and normals. We are currently experimenting with supporting &quot;fully deferred&quot; rendering as well, which opens the doors to new effects and different performance tradeoffs.</li> +</ul> +<p>From a high level, we plan to focus on the Asset System, UI, Render Features, and Scenes during the next cycle.</p> +<p>Check out the <a href="https://github.com/bevyengine/bevy/milestone/14"><strong>Bevy 0.12 Milestone</strong></a> for an up-to-date list of current work being considered for <strong>Bevy 0.12</strong>.</p> +<h2 id="support-bevy">Support Bevy +<a class="anchor-link" href="#support-bevy">#</a> +</h2> +<p>Sponsorships help make our work on Bevy sustainable. If you believe in Bevy's mission, consider <a href="/community/donate">sponsoring us</a> ... every bit helps!</p> +<p><a class="button button--pink header__cta" href="/community/donate">Donate <img class="button__icon" src="/assets/heart.svg" alt="heart icon"></a></p> +<h2 id="contributors">Contributors +<a class="anchor-link" href="#contributors">#</a> +</h2> +<p>Bevy is made by a <a href="/community/people/">large group of people</a>. A huge thanks to the 166 contributors that made this release (and associated docs) possible! In random order:</p> +<ul> +<li>@TheBlek</li> +<li>@hank</li> +<li>@TimJentzsch</li> +<li>@Suficio</li> +<li>@SmartManLudo</li> +<li>@BlondeBurrito</li> +<li>@lewiszlw</li> +<li>@paul-hansen</li> +<li>@boringsan</li> +<li>@superdump</li> +<li>@JonahPlusPlus</li> +<li>@airingursb</li> +<li>@Sheepyhead</li> +<li>@nakedible</li> +<li>@Testare</li> +<li>@andresovela</li> +<li>@SkiFire13</li> +<li>@doup</li> +<li>@BlackPhlox</li> +<li>@nicoburns</li> +<li>@wpederzoli</li> +<li>@adtennant</li> +<li>@LoopyAshy</li> +<li>@KernelFreeze</li> +<li>@ickshonpe</li> +<li>@jim-ec</li> +<li>@mrchantey</li> +<li>@frengor</li> +<li>@Joakker</li> +<li>@arendjr</li> +<li>@MJohnson459</li> +<li>@TheTacBanana</li> +<li>@IceSentry</li> +<li>@ItsDoot</li> +<li>@Anti-Alias</li> +<li>@mwbryant</li> +<li>@inodentry</li> +<li>@LiamGallagher737</li> +<li>@robtfm</li> +<li>@mockersf</li> +<li>@ndarilek</li> +<li>@samtenna</li> +<li>@Estus-Dev</li> +<li>@InnocentusLime</li> +<li>@p-hueber</li> +<li>@B-Reif</li> +<li>@Adamkob12</li> +<li>@payload</li> +<li>@JohnTheCoolingFan</li> +<li>@djeedai</li> +<li>@SludgePhD</li> +<li>@s-lambert</li> +<li>@kjolnyr</li> +<li>@Skovrup1</li> +<li>@Ababwa</li> +<li>@Illiux</li> +<li>@Carter0</li> +<li>@luca-della-vedova</li> +<li>@Neo-Zhixing</li> +<li>@coreh</li> +<li>@helvieq499</li> +<li>@Carbonhell</li> +<li>@BrandonDyer64</li> +<li>@hymm</li> +<li>@JMS55</li> +<li>@iiYese</li> +<li>@mtsr</li> +<li>@jannik4</li> +<li>@natasria</li> +<li>@Trouv</li> +<li>@minchopaskal</li> +<li>@chrisjuchem</li> +<li>@marlyx</li> +<li>@valaphee</li> +<li>@hankjordan</li> +<li>@rparrett</li> +<li>@Selene-Amanita</li> +<li>@opstic</li> +<li>@loganbenjamin</li> +<li>@MrGunflame</li> +<li>@pyrotechnick</li> +<li>@mjhostet</li> +<li>@VitalyAnkh</li> +<li>@CatThingy</li> +<li>@maniwani</li> +<li>@Themayu</li> +<li>@SET001</li> +<li>@jakobhellermann</li> +<li>@MrGVSV</li> +<li>@nicopap</li> +<li>@Wcubed</li> +<li>@aevyrie</li> +<li>@NiklasEi</li> +<li>@bonsairobo</li> +<li>@cart</li> +<li>@TotalKrill</li> +<li>@raffaeleragni</li> +<li>@Aceeri</li> +<li>@Shatur</li> +<li>@orzogc</li> +<li>@UncleScientist</li> +<li>@Elabajaba</li> +<li>@vyb</li> +<li>@komadori</li> +<li>@jnhyatt</li> +<li>@harudagondi</li> +<li>@konsti219</li> +<li>@james7132</li> +<li>@mvlabat</li> +<li>@neithanmo</li> +<li>@dgunay</li> +<li>@Shfty</li> +<li>@hate</li> +<li>@B-head</li> +<li>@MinerSebas</li> +<li>@chescock</li> +<li>@BorMor</li> +<li>@lupan</li> +<li>@CrazyRoka</li> +<li>@bzm3r</li> +<li>@Sixmorphugus</li> +<li>@JoJoJet</li> +<li>@eltociear</li> +<li>@gakit</li> +<li>@geieredgar</li> +<li>@tjamaan</li> +<li>@alice-i-cecile</li> +<li>@NoahShomette</li> +<li>@james-j-obrien</li> +<li>@tinrab</li> +<li>@Olle-Lukowski</li> +<li>@TheRawMeatball</li> +<li>@sarkahn</li> +<li>@RobWalt</li> +<li>@johanhelsing</li> +<li>@SneakyBerry</li> +<li>@beeryt</li> +<li>@Vrixyz</li> +<li>@wainwrightmark</li> +<li>@EliasPrescott</li> +<li>@konsolas</li> +<li>@ameknite</li> +<li>@Connor-McMillin</li> +<li>@Weibye</li> +<li>@SpecificProtagonist</li> +<li>@danchia</li> +<li>@vallrand</li> +<li>@atornity</li> +<li>@soqb</li> +<li>@devil-ira</li> +<li>@AnthonyKalaitzis</li> +<li>@yyogo</li> +<li>@NiseVoid</li> +<li>@gajop</li> +<li>@Gingeh</li> +<li>@zendril</li> +<li>@ezekg</li> +<li>@ickk</li> +<li>@Leonss23</li> +<li>@kellencataldo</li> +<li>@akappel</li> +<li>@hazelsparrow</li> +<li>@mattfbacon</li> +<li>@gianzellweger</li> +<li>@lakrsv</li> +<li>@laundmo</li> +</ul> +<h2 id="full-changelog">Full Changelog +<a class="anchor-link" href="#full-changelog">#</a> +</h2> +<h3 id="rendering">Rendering +<a class="anchor-link" href="#rendering">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8336">Webgpu support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5703">improve shader import model</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7402">Screen Space Ambient Occlusion (SSAO) MVP</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7291">Temporal Antialiasing (TAA)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6529">Immediate Mode Line/Gizmo Drawing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8109">Make render graph slots optional for most cases</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8090">Split opaque and transparent phases</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8275">Built-in skybox</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5928">Add parallax mapping to bevy PBR</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7422">Add port of AMD's Robust Contrast Adaptive Sharpening</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8007">Add RenderGraphApp to simplify adding render nodes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7163">Add screenshot API</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8158">Add morph targets</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8455">Screenshots in wasm</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8118">Add ViewNode to simplify render node management</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7614">Bias texture mipmaps</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8427">Instanced line rendering for gizmos based on <code>bevy_polyline</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8042">Add <code>RenderTarget::TextureView</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8685">Change default tonemapping method</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6815">Allow custom depth texture usage</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8231">Use the prepass normal texture in main pass when possible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8122">Left-handed y-up cubemap coordinates</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7772">Allow SPIR-V shaders to process when shader defs are present</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8299">Remove unnecesssary values Vec from DynamicUniformBuffer and DynamicStorageBuffer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6697">Add <code>MAY_DISCARD</code> shader def, enabling early depth tests for most cases</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7885">Add <code>Aabb</code> calculation for <code>Sprite</code>, <code>TextureAtlasSprite</code> and <code>Mesh2d</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8041">Color::Lcha constructors</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8040">Fix Color::as_rgba_linear for Color::Lcha</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8070">Added Globals struct to prepass shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8121">Derive Copy and Clone for Collision</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8151">Fix crash when enabling HDR on 2d cameras</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7977">Dither fix</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8460">Compute <code>vertex_count</code> for indexed meshes on <code>GpuMesh</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/9024">Run update_previous_view_projections in PreUpdate schedule</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8220">Added <code>WebP</code> image format support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8601">Add support for pnm textures</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8316">fix invalid bone weights</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8412">Fix pbr shader breaking on missing UVs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8878">Fix Plane UVs / texture flip</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7817">Fix look_to resulting in NaN rotations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8627">Fix look_to variable naming</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8223">Fix segfault with 2d gizmos</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8298">Use RenderGraphApp in more places</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8323">Fix viewport change detection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8301">Remove capacity fields from all Buffer wrapper types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8380">Sync pbr_types.wgsl StandardMaterial values</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8180">Avoid spawning gizmo meshes when no gizmos are being drawn</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/9030">Use a consistent seed for AABB gizmo colors</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8444">bevy_pbr: Do not cull meshes without Aabbs from cascades</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8330">Handle vertex_uvs if they are present in default prepass fragment shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7867">Changed (Vec2, Vec2) to Rect in Camera::logical_viewport_rect</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8491">make glsl and spirv support optional</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8978">fix prepass normal_mapping</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8564">conversions between [u8; 4] and Color</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8952">Add option to disable gizmo rendering for specific cameras</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/9013">Fix morph target prepass shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8631">Fix bloom wasm support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8926">Fix black spots appearing due to NANs when SSAO is enabled</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8890">fix normal prepass</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8977">Refs #8975 -- Add return to RenderDevice::poll()</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8508">Fix WebGL mode for Adreno GPUs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/9003">Fix parallax mapping</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8575">Added Vec append to BufferVec - Issue #3531</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8993">Fix CAS shader with explicit FullscreenVertexOutput import</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8643">Make <code>TextureAtlas::texture_handles</code> <code>pub</code> instead of <code>pub(crate)</code> (#8633)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8642">Make Material2d pipeline systems public</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8701">Fix screenshots on Wayland + Nvidia</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8704">Apply codebase changes in preparation for <code>StandardMaterial</code> transmission</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8732">Use ViewNode for TAA</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8753">Change Camera3dBundle::tonemapping to Default</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8804">Remove <code>Component</code> derive for AlphaMode</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8408">Make setup of Opaque3dPrepass and AlphaMask3dPrepass phase items consistent with others</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8744">Rename <code>Plane</code> struct to <code>HalfSpace</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6974">Expand <code>FallbackImage</code> to include a <code>GpuImage</code> for each possible <code>TextureViewDimension</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8877">Cascaded shadow maps: Fix prepass ortho depth clamping</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8910">Fix gizmos in WebGPU</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8868">Fix AsBindGroup derive, texture attribute, visibility flag parsing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8802">Disable camera on window close</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8283">Reflect <code>Component</code> and <code>Default</code> of <code>BloomSettings</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8428">Add Reflection Macros to TextureAtlasSprite</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8801">Implement Reflect on NoFrustumCulling</a></li> +</ul> +<h3 id="audio">Audio +<a class="anchor-link" href="#audio">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8424">ECS-based API redesign</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7706">Ability to set a Global Volume</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8145">Expose <code>AudioSink::empty()</code></a></li> +</ul> +<h3 id="diagnostics">Diagnostics +<a class="anchor-link" href="#diagnostics">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8677">Allow systems using Diagnostics to run in parallel</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8272">add a feature for memory tracing with tracy</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8362">Re-add the &quot;frame&quot; span for tracy comparisons</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8886">log to stderr instead of stdout</a></li> +</ul> +<h3 id="scenes">Scenes +<a class="anchor-link" href="#scenes">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/6793">bevy_scene: Add SceneFilter</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6846">(De) serialize resources in scenes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8065">add position to scene errors</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7951">Bugfix: Scene reload fix (nonbreaking)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8512">avoid panic with parented scenes on deleted entities</a></li> +</ul> +<h3 id="transform-hierarchy">Transform + Hierarchy +<a class="anchor-link" href="#transform-hierarchy">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/7264">Fix transform propagation of orphaned entities</a></li> +</ul> +<h3 id="gizmo">Gizmo +<a class="anchor-link" href="#gizmo">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8468">Add a bounding box gizmo</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8448">Added <code>arc_2d</code> function for gizmos</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8960">Use AHash to get color from entity in bevy_gizmos</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8434">do not crash when rendering only one gizmo</a></li> +</ul> +<h3 id="reflection">Reflection +<a class="anchor-link" href="#reflection">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/7184">reflect: stable type path v2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6971">bevy_reflect: Better proxies</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6056">bevy_reflect: FromReflect Ergonomics Implementation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8514">bevy_reflect: Allow <code>#[reflect(default)]</code> on enum variant fields</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8776">Add FromReflect where Reflect is used</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8691">Add get_at_mut to bevy_reflect::Map trait</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8764">Reflect now requires DynamicTypePath. Remove Reflect::get_type_path()</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8495">bevy_ui: Add <code>FromReflect</code> derives</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8531">Add Reflect and FromReflect for AssetPath</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8014">bevy_reflect: Fix trailing comma breaking derives</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8184">Fix Box<dyn Reflect> struct with a hashmap in it panicking when clone_value is called on it</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8496">bevy_reflect: Add <code>ReflectFromReflect</code> to the prelude</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8723">bevy_reflect: Allow construction of MapIter outside of the bevy_reflect crate.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8761">bevy_reflect: Disambiguate type bounds in where clauses.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7454">adding reflection for Cow&lt;'static, [T]&gt;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8891">Do not require mut on ParsedPath::element_mut</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8905">Reflect UUID</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7112">Don't ignore additional entries in <code>UntypedReflectDeserializerVisitor</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7407">Construct Box<dyn Reflect> from world for ReflectComponent</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8957">reflect: avoid deadlock in GenericTypeCell</a></li> +</ul> +<h3 id="app">App +<a class="anchor-link" href="#app">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8097">Allow tuples and single plugins in <code>add_plugins</code>, deprecate <code>add_plugin</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8585">Merge ScheduleRunnerSettings into ScheduleRunnerPlugin</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8740">correctly setup everything in the default run_once runner</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8103">Fix <code>Plugin::build</code> detection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/9054">Fix not calling App::finish and App::cleanup in <code>ScheduleRunnerPlugin</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8961">Relaxed runner type from Fn to FnOnce</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8982">Relax FnMut to FnOnce in app::edit_schedule</a></li> +</ul> +<h3 id="windowing-reflection">Windowing + Reflection +<a class="anchor-link" href="#windowing-reflection">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/7993">Register missing types in bevy_window</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8771">bevy_reflect: implement Reflect for SmolStr</a></li> +</ul> +<h3 id="hierarchy">Hierarchy +<a class="anchor-link" href="#hierarchy">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8346">fix panic when moving child</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8476">Remove <code>Children</code> component when calling <code>despawn_descendants</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8928">Change <code>despawn_descendants</code> to return <code>&amp;mut Self</code></a></li> +</ul> +<h3 id="time">Time +<a class="anchor-link" href="#time">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8467">Fix timer with zero duration</a></li> +</ul> +<h3 id="assets">Assets +<a class="anchor-link" href="#assets">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8503">Delay asset hot reloading</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5370">Add support for custom glTF vertex attributes.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8485">Fix panic when using debug_asset_server</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7938"><code>unused_variables</code> warning when building with <code>filesystem_watcher</code> feature disabled</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8470">bevy_asset: Add <code>LoadContext::get_handle_untyped</code></a></li> +</ul> +<h3 id="windowing">Windowing +<a class="anchor-link" href="#windowing">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/7988">Move cursor position to internal state</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7966">Set cursor hittest during window creation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7996">do not set hit test unconditionally on window creation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8722">Add winit's <code>wayland-csd-adwaita</code> feature to Bevy's <code>wayland</code> feature</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8593">Support to set window theme and expose system window theme changed event</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8791">Touchpad magnify and rotate events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8903">Fix windows not being centered properly when system interface is scaled</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/9016">Expose WindowDestroyed events</a></li> +</ul> +<h3 id="animation">Animation +<a class="anchor-link" href="#animation">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/9023">Register bevy_animation::PlayingAnimation</a></li> +</ul> +<h3 id="ui">UI +<a class="anchor-link" href="#ui">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/7795">Ui Node Borders</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8026">Add CSS Grid support to <code>bevy_ui</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7779"><code>text_system</code> split</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8549">Replace the local text queues in the text systems with flags stored in a component</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8947"><code>NoWrap</code> <code>Text</code> feature</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8445">add a default font</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8822">UI texture atlas support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8793">Improved UI render batching</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8306">Consistent screen-space coordinates</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8199"><code>UiImage</code> helper functions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7819">Perform text scaling calculations per text, not per glyph</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8197">Fix size of clipped text glyphs.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8545">Apply scale factor to <code>ImageMeasure</code> sizes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8933">Fix WebGPU error in &quot;ui_pipeline&quot; by adding a flat interpolate attribute</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/9027">Rename Interaction::Clicked -&gt; Interaction::Pressed</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8548">Flatten UI <code>Style</code> properties that use <code>Size</code> + remove <code>Size</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8095">Split UI <code>Overflow</code> by axis</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7930">Add methods for calculating the size and postion of UI nodes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7809">Skip the UV calculations for untextured UI nodes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8425">Fix text measurement algorithm</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8720">Divide by UiScale when converting UI coordinates from physical to logical</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8402"><code>MeasureFunc</code> improvements</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8522">Expose sorting methods in <code>Children</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7948">Fix min and max size using size value</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8019">Fix the <code>Text2d</code> text anchor's incorrect horizontal alignment</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7485">Remove <code>Val::Undefined</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8137"><code>Val</code> viewport unit variants</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8294">Remove the corresponding measure from Taffy when a <code>CalculatedSize</code> component is removed.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7656"><code>UiRect</code> axes constructor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8195">Fix the UV calculations for clipped and flipped ImageNodes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8422">Fix text systems broken when resolving merge conflicts in #8026</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8437">Allow <code>bevy_ui</code> crate to compile without the <code>text</code> feature enabled</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8264">Fix the double leaf node updates in <code>flex_node_system</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8456">also import the default handle when feature disabled</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8466"><code>measure_text_system</code> text query fix</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8497">Fix panic in example: text_wrap_debug.rs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8521">UI layout tree debug print</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8551">Fix <code>Node::physical_rect</code> and add a <code>physical_size</code> method</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8795">Perform <code>relative_cursor_position</code> calculation vectorwise in <code>ui_focus_system</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8866">Add <code>UiRect::px()</code> and <code>UiRect::percent()</code> utils</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8920">Add missing dependencies to <code>bevy_text</code> feature</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8907">Remove &quot;bevy_text&quot; feature attributes on imports used by non-text systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8931">Growing UI nodes Fix</a></li> +</ul> +<h3 id="ecs">ECS +<a class="anchor-link" href="#ecs">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8079">Schedule-First: the new and improved add_systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7936">Add OnTransition schedule that is ran between OnExit and OnEnter</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7676"><code>run_if</code> for <code>SystemConfigs</code> via anonymous system sets</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8260">Remove OnUpdate system set</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8726">Rename apply_system_buffers to apply_deferred</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8814">Rename Command's &quot;write&quot; method to &quot;apply&quot;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7086">Require <code>#[derive(Event)]</code> on all Events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6960">Implement WorldQuery for EntityRef</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7085">Improve or-with disjoint checks</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8849">Add a method to run read-only systems using <code>&amp;World</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8053">Reduce branching when inserting components</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8030">Make <code>#[system_param(ignore)]</code> and <code>#[world_query(ignore)]</code> unnecessary</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8265">Remove <code>#[system_param(ignore)]</code> and <code>#[world_query(ignore)]</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8119">Extend the <code>WorldQuery</code> macro to tuple structs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8009">Make state private and only accessible through getter for State resource</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8668">implement <code>Deref</code> for <code>State&lt;S&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8083">Inline more ECS functions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8387">Add a <code>scope</code> API for world schedules</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8377">Simplify system piping and make it more flexible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8326">Add <code>any_component_removed</code> condition</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8174">Use <code>UnsafeWorldCell</code> to increase code quality for <code>SystemParam</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8292">Improve safety for the multi-threaded executor using <code>UnsafeWorldCell</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8833">Migrate the rest of the engine to <code>UnsafeWorldCell</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8721">Make the <code>Condition</code> trait generic</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8714">Add or_else combinator to run_conditions.rs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8772">Add iter_many_manual QueryState method</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8987">Provide access to world storages via UnsafeWorldCell</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8844">Added Has<T> WorldQuery type</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8951">Add/fix <code>track_caller</code> attribute on panicking entity accessor methods</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7905">Increase type safety and clarity for change detection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7964">Make <code>WorldQuery</code> meta types unnameable</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7931">Add a public constructor for <code>Mut&lt;T&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7902">Remove ChangeTrackers</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/9020">Derive Eq, PartialEq for Tick</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7911">Initialize empty schedules when calling <code>.in_schedule</code> if they do not already exist</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8001">Replace multiple calls to <code>add_system</code> with <code>add_systems</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7950">don't panic on unknown ambiguity</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8060">add Clone to common conditions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8068">Make BundleInfo's fields not pub(crate)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8029">Pass query change ticks to <code>QueryParIter</code> instead of always using change ticks from <code>World</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8108">Remove redundant bounds check in <code>Entities::get</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8028">Add World::try_run_schedule</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8105">change not implemation to custom system struct</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8012">Fix name conflicts caused by the <code>SystemParam</code> and <code>WorldQuery</code> macros</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8154">Check for conflicting accesses in <code>assert_is_system</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8163">Fix field visibility for read-only <code>WorldQuery</code> types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8212"><code>Or&lt;T&gt;</code> should be a new type of <code>PhantomData&lt;T&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8249">Make standard commands more ergonomic (in niche cases)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8269">Remove base set error variants of <code>ScheduleBuildError</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8274">Replace some unsafe system executor code with safe code</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8295">Update <code>increment_change_tick</code> to return a strongly-typed <code>Tick</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7732">Move event traces to detailed_trace!</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8359">Only trigger state transitons if <code>next_state != old_state</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8364">Fix panics and docs when using World schedules</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8000">Improve warning for Send resources marked as non_send</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8419">Reorganize system modules</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8436">Fix boxed labels</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8403">Simplify world schedule methods</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8494">Just print out name string, not the entire Name struct</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8529">Manually implement common traits for <code>EventId</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8567">Replace remaining uses of <code>&amp;T, Changed&lt;T&gt;</code> with <code>Ref</code> in UI system queries</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8588">Rename <code>UnsafeWorldCell::read_change_tick</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8725">Improve encapsulation for commands and add docs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8743">Fix all_tuples + added docs.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8797">Add <code>new</code> and <code>map</code> methods to <code>Ref</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8817">Allow unsized types as mapped value in <code>Ref::map</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8826">Implement <code>Clone</code> for <code>CombinatorSystem</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8818">Add get_ref to EntityRef</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8848">Make <code>QueryParIter::for_each_unchecked</code> private</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8845">Simplify the <code>ComponentIdFor</code> type</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8803">Add last_changed_tick and added_tick to ComponentTicks</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8832">Require read-only queries in <code>QueryState::par_iter</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8939">Fix any_component_removed</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8843">Deprecate type aliases for <code>WorldQuery::Fetch</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7204">bevy_ecs: add untyped methods for inserting components and bundles</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8901">Move AppTypeRegistry to bevy_ecs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8760">skip check change tick for apply_deferred systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8834">Split the bevy_ecs reflect.rs module</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8687">Make function pointers of ecs Reflect* public</a></li> +</ul> +<h3 id="rendering-reflection-scenes">Rendering + Reflection + Scenes +<a class="anchor-link" href="#rendering-reflection-scenes">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8088">fix: register Cascade in the TypeRegistry</a></li> +</ul> +<h3 id="tasks">Tasks +<a class="anchor-link" href="#tasks">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/6690">Add optional single-threaded feature to bevy_ecs/bevy_tasks</a></li> +</ul> +<h3 id="math">Math +<a class="anchor-link" href="#math">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8232">Re-export glam_assert feature</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8049">Fix CubicCurve::iter_samples iteration count</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7984">Add integer equivalents for <code>Rect</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8711">Add <code>CubicCurve::segment_count</code> + <code>iter_samples</code> adjustment</a></li> +</ul> +<h3 id="rendering-assets-meta">Rendering + Assets + Meta +<a class="anchor-link" href="#rendering-assets-meta">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/7855">Add depending bevy features for higher level one</a></li> +</ul> +<h3 id="ecs-scenes">ECS + Scenes +<a class="anchor-link" href="#ecs-scenes">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/7335">Make scene handling of entity references robust</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7570">Rename map_entities and map_specific_entities</a></li> +</ul> +<h3 id="util">Util +<a class="anchor-link" href="#util">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8552">bevy_derive: Add <code>#[deref]</code> attribute</a></li> +</ul> +<h3 id="input">Input +<a class="anchor-link" href="#input">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8398">Add gamepad rumble support to bevy_input</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8792">Rename keys like <code>LAlt</code> to <code>AltLeft</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8852">Add window entity to mouse and keyboard events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8871">Add get_unclamped to Axis</a></li> +</ul> +<h3 id="upgrades">Upgrades +<a class="anchor-link" href="#upgrades">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/7959">Upgrade Taffy requirement to v0.3.5</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8622">Update ruzstd and basis universal</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8446">Updated to wgpu 0.16.0, wgpu-hal 0.16.0 and naga 0.12.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8650">Update sysinfo requirement from 0.28.1 to 0.29.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8649">Update libloading requirement from 0.7 to 0.8</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8573">update syn, encase, glam and hexasphere</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7925">Update android_log-sys requirement from 0.2.0 to 0.3.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8728">update bitflags to 2.3</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8755">Update ruzstd requirement from 0.3.1 to 0.4.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8757">Update notify requirement from 5.0.0 to 6.0.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8904">Bump hashbrown to 0.14</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8623">update ahash and hashbrown</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8655">Bump accesskit and accesskit_winit</a></li> +</ul> +<h3 id="examples">Examples +<a class="anchor-link" href="#examples">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/8561">new example showcase tool</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8194">Adding a bezier curve example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6909">Add low level post process example using a custom render pass</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8909">Add example to demonstrate manual generation and UV mapping of 3D mesh (generate_custom_mesh) solve #4922</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/8198">Add <code>overflow_debug</code> example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7761">UI text wrapping and <code>LineBreakOn</code> example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7956">Size Constraints Example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7629">UI Display and Visibility Example</a></li> +</ul> + + + + Bevy + WebGPU + 2023-05-17T00:00:00+00:00 + 2023-05-17T00:00:00+00:00 + + https://bevyengine.org/news/bevy-webgpu/ + <p>I'm excited to announce that Bevy's main branch now supports WebGPU rendering on the web! This means you can <a href="https://github.com/bevyengine/bevy">play with it now by checking out our repo</a> provided you have a <a href="https://caniuse.com/webgpu">supported web browser</a> (WebGPU is still in the process of rolling out). You can also explore our <a href="/examples-webgpu">live WebGPU examples</a>. The upcoming <a href="https://github.com/bevyengine/bevy/milestone/11">Bevy 0.11 release</a> will have WebGPU support built in, which is slated for release in about a month!</p> +<h2 id="what-is-webgpu">What is WebGPU? +<a class="anchor-link" href="#what-is-webgpu">#</a> +</h2> +<p>WebGPU is an <a href="https://github.com/gpuweb/gpuweb">exciting new web standard</a> for doing modern GPU graphics and compute. It takes inspiration from Vulkan, Direct3D 12, and Metal. In fact, it is generally implemented on top of these APIs under the hood. WebGPU gives us access to more GPU features than WebGL2 (such as compute shaders) and also has the potential to be much faster. It means that more of Bevy's native renderer features are now also available on the web. It also uses the new <a href="https://www.w3.org/TR/WGSL">WGSL shader language</a>. We're very happy with how WGSL has evolved over time and Bevy uses it internally for our shaders. We also added usability features like imports! But with Bevy you still have the option to use GLSL if you prefer.</p> +<p>WebGPU has started making waves because <a href="https://developer.chrome.com/blog/webgpu-release/">Chrome just shipped WebGPU support in Chrome 113</a>, which means people with normal Chrome releases can start testing it. Firefox and Safari also have implementations in the works!</p> +<h2 id="what-is-bevy">What is Bevy? +<a class="anchor-link" href="#what-is-bevy">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevy-webgpu/ruins.png" alt="ruins" /></p> +<p>For those who don't know, Bevy is a refreshingly simple cross-platform data-driven game engine built in Rust. It has a modern and extensible 2D and 3D renderer, a best-in-class ECS (entity component system) that is delightful to use, <a href="/">plenty of features</a>, and a vibrant and open <a href="/community">developer community</a>. It currently supports Windows, MacOS, Linux, iOS, and Web. We also have work in progress Android support ... and ambitions for even more platforms in the future!</p> +<p>You can check out our <a href="/learn/book/getting-started/">Quick Start Guide</a> to try it today. It is free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. Check out <a href="https://bevyengine.org/assets">Bevy Assets</a> for a collection of community-developed plugins, games, and learning resources.</p> +<span id="continue-reading"></span><h2 id="bevy-s-webgpu-example-page">Bevy's WebGPU Example Page +<a class="anchor-link" href="#bevy-s-webgpu-example-page">#</a> +</h2> +<p>Bevy's native examples can also run right in your browser. This already <a href="/examples">worked with WASM / WebGL2</a>, but we've built a <a href="/examples-webgpu/">new and improved Bevy WebGPU example page</a> to showcase the new WebGPU backend. Just make sure you <a href="https://caniuse.com/webgpu">have a compatible browser</a> first as WebGPU is still in the process of rolling out!</p> +<p><a href="/examples-webgpu"><img src="https://bevyengine.org/news/bevy-webgpu/examples.png" alt="webgpu examples page screenshot" /></a></p> +<h2 id="how-it-works">How it Works +<a class="anchor-link" href="#how-it-works">#</a> +</h2> +<p>Bevy is built on top of the <a href="https://github.com/gfx-rs/wgpu">wgpu</a> library, which is a modern low-level GPU API that can target pretty much every popular API: Vulkan, Direct3D 12, Metal, OpenGL, WebGL2, and WebGPU. The best backend API is selected for a given platform. It is a &quot;native&quot; rendering API, but it generally follows the WebGPU terminology and API design. Unlike WebGPU, it can provide direct access to the native APIs, which means Bevy enjoys a &quot;best of all worlds&quot; situation:</p> +<ul> +<li>Fast and low level rendering backed by the best API for a given operating system + hardware combination</li> +<li>A much more approachable API than Vulkan, which means Bevy Plugin developers can easily build powerful cross platform renderer features</li> +<li>Developers can code to the &quot;default&quot; feature set and it will generally work &quot;everywhere&quot;</li> +<li>Developers can opt in to native feature &quot;extensions&quot; (such as raytracing, VR, etc) on platforms that support them, even if they are not covered by the WebGPU spec. wgpu is very open to exposing new features! A <a href="https://github.com/gfx-rs/wgpu/pull/3507">ray tracing proposal</a> is currently being developed, some <a href="https://github.com/gfx-rs/wgpu/issues/3637">&quot;bindless&quot; rendering</a> features have already been implemented (and <a href="https://github.com/bevyengine/bevy/blob/main/examples/shader/texture_binding_array.rs">exposed in Bevy</a>), and the Bevy community already has some OpenXR experiments in the works!</li> +</ul> +<p>Bevy was built on <a href="https://github.com/gfx-rs/wgpu">wgpu</a> from the very beginning, which meant most of the hard work of supporting WebGPU was already done. But we actually only recently did the last mile effort to get WebGPU rendering working, thanks to the <a href="https://github.com/bevyengine/bevy/pull/8336">efforts of François Mockers</a> (one of Bevy's maintainers). They reworked some of our renderer initialization to satisfy the async requirements of WebGPU initialization. They also adapted some of our renderer features to be compatible. François also built our cool new <a href="/examples-webgpu">WebGPU examples page</a>!</p> +<h2 id="compiling-bevy-apps-for-webgpu">Compiling Bevy Apps for WebGPU +<a class="anchor-link" href="#compiling-bevy-apps-for-webgpu">#</a> +</h2> +<p>WebGPU support will land in the <a href="https://github.com/bevyengine/bevy/milestone/11">next Bevy release</a> (<strong>Bevy 0.11</strong>). This means that the <a href="/news/bevy-0-10">current Bevy release</a> does not support WebGPU! If you would like to test out Bevy + WebGPU <em>right now</em>, just use Bevy's <code>main</code> branch:</p> +<pre data-lang="txt" class="language-txt z-code"><code class="language-txt" data-lang="txt"><span class="z-text z-plain">git clone https://github.com/bevyengine/bevy +</span></code></pre> +<p>From there, after <a href="https://github.com/bevyengine/bevy/tree/main/examples#setup-2">setting up wasm-bindgen</a> you can build any of the Bevy examples for WebGPU using this command:</p> +<pre data-lang="txt" class="language-txt z-code"><code class="language-txt" data-lang="txt"><span class="z-text z-plain">cargo run -p build-wasm-example -- --api webgpu load_gltf +</span></code></pre> +<p>You can replace the <code>load_gltf</code> example with the name of any of <a href="https://github.com/bevyengine/bevy/tree/main/examples">Bevy's examples</a>.</p> +<p>Note that when <a href="https://bevy-cheatbook.github.io/platforms/wasm.html">building your own Bevy Apps for the Web</a>, WebGL2 is still the default backend. This will continue to be true until WebGPU support is more universal.</p> + + + + Bevy 0.10 + 2023-03-06T00:00:00+00:00 + 2023-03-06T00:00:00+00:00 + + https://bevyengine.org/news/bevy-0-10/ + <p>Thanks to <strong>173</strong> contributors, <strong>689</strong> pull requests, community reviewers, and our <a href="/community/donate"><strong>generous sponsors</strong></a>, we're happy to announce the <strong>Bevy 0.10</strong> release on <a href="https://crates.io/crates/bevy">crates.io</a>!</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out our <a href="/learn/book/getting-started/">Quick Start Guide</a> to try it today. It's free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. Check out <a href="https://bevyengine.org/assets">Bevy Assets</a> for a collection of community-developed plugins, games, and learning resources.</p> +<p>To update an existing Bevy App or Plugin to <strong>Bevy 0.10</strong>, check out our <a href="/learn/migration-guides/0.9-0.10/">0.9 to 0.10 Migration Guide</a>.</p> +<p>Since our last release a few months ago we've added a <em>ton</em> of new features, bug fixes, and quality of life tweaks, but here are some of the highlights:</p> +<span id="continue-reading"></span> +<ul> +<li><strong>ECS Schedule v3</strong>: Bevy now has much simpler, more flexible scheduling. Systems are now stored in a unified schedule, commands can be applied explicitly via <code>apply_system_buffers</code>, and a whole lot of quality of life and bug fixes.</li> +<li><strong>Cascaded Shadow Maps</strong>: Higher quality shadow maps that cover larger distances, where the quality follows the camera.</li> +<li><strong>Environment Map Lighting</strong>: 360 degree ambient image based lighting that can cheaply and drastically improve the visual quality of a scene.</li> +<li><strong>Depth and Normal Prepass</strong>: Render depth and normal textures for a scene prior to the main pass, enabling new effects and (in some cases) improved performance. Shadow mapping uses the prepass shaders, which enables transparent textures to cast shadows.</li> +<li><strong>Smooth Skeletal Animation Transitions</strong>: Smoothly transition between two skeletal animations playing at the same time!</li> +<li><strong>Improved Android Support</strong>: Bevy now works out of the box on more Android devices (with a couple of caveats)</li> +<li><strong>Revamped Bloom</strong>: Bloom now looks better, is easier to control, and has fewer visual artifacts.</li> +<li><strong>Distance and Atmospheric Fog</strong>: Add depth and ambiance to your scene with 3D distance and atmospheric fog effects!</li> +<li><strong>StandardMaterial Blend Modes</strong>: Achieve a variety of interesting effects with more PBR material blend modes.</li> +<li><strong>More Tonemapping Choices</strong>: Choose one of 7 popular tonemapping algorithms for your HDR scenes to achieve the visual style you are looking for.</li> +<li><strong>Color Grading</strong>: Control per-camera exposure, gamma, &quot;pre-tonemapping saturation&quot;, and &quot;post-tonemapping saturation&quot;.</li> +<li><strong>Parallel Pipelined Rendering</strong>: App logic and render logic now run in parallel automatically, yielding significant performance wins.</li> +<li><strong>Windows as Entities</strong>: Windows are now represented as entities instead of resources, improving the user experience and unlocking new scenarios.</li> +<li><strong>Renderer Optimizations</strong>: We spent a <em>ton</em> of effort optimizing the renderer this cycle. Bevy's renderer is snappier than ever!</li> +<li><strong>ECS Optimizations</strong>: Likewise, we've turbocharged many common ECS operations. Bevy apps get a nice speed boost!</li> +</ul> +<h2 id="ecs-schedule-v3">ECS Schedule v3 +<a class="anchor-link" href="#ecs-schedule-v3">#</a> +</h2> +<div class="release-feature-authors">authors: @alice-i-cecile, @maniwani, @WrongShoe, @cart, @jakobhellermann, @JoJoJet, @geieredgar and a whole lot more </div> +<p>Thanks to the fantastic work of our ECS team, the hotly awaited <a href="https://github.com/bevyengine/rfcs/blob/main/rfcs/45-stageless.md">&quot;stageless&quot; scheduling RFC</a> has been implemented!</p> +<p><strong>Schedule v3</strong> is the culmination of significant design and implementation work. Scheduling APIs are a central and defining part of the Bevy developer experience, so we had to be very thoughtful and meticulous about this next evolution of the API. In addition to the <a href="https://github.com/bevyengine/rfcs/pull/45">RFC PR</a>, the <a href="https://github.com/bevyengine/bevy/pull/6587">initial implementation PR</a> by <code>@maniwani</code> and the <a href="https://github.com/bevyengine/bevy/pull/7267">Bevy Engine internals port PR</a> by <code>@alice-i-cecile</code> are great places to start if you would like a view into our process and rationale. As we all know, plans and implementations are two different things. Our final implementation is a bit different from the initial RFC (in a good way).</p> +<p>There are a ton of changes, but we've put a lot of care into ensuring the <a href="/learn/migration-guides/0.9-0.10/#migrate-engine-to-schedule-v3-stageless">migration path</a> for existing applications is relatively straightforward. Don't sweat it!</p> +<p>Let's take a look at what shipped in 0.10!</p> +<h3 id="a-single-unified-schedule">A Single Unified Schedule +<a class="anchor-link" href="#a-single-unified-schedule">#</a> +</h3> +<p>Have you ever wanted to specify that <code>system_a</code> runs before <code>system_b</code>, only to be met with confusing warnings that <code>system_b</code> isn't found because it's in a different stage?</p> +<p>No more! All systems within a single <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/struct.Schedule.html"><code>Schedule</code></a> are now stored in a single data structure with a global awareness of what's going on.</p> +<p>This simplifies our internal logic, makes your code more robust to refactoring, and allows plugin authors to specify high-level invariants (e.g. &quot;movement must occur before collision checking&quot;) without locking themselves into an exact schedule location.</p> +<p><a href="main_schedule_diagram.svg"><img src="https://bevyengine.org/news/bevy-0-10/main_schedule_diagram.svg" alt="main_schedule_diagram" /></a></p> +<p>This diagram made with <a href="https://github.com/jakobhellermann/bevy_mod_debugdump">@jakobhellermann's <code>bevy_mod_debugdump</code> crate</a> shows a simplified version of Bevy's default schedule.</p> +<h3 id="adding-systems">Adding Systems +<a class="anchor-link" href="#adding-systems">#</a> +</h3> +<p><a href="https://docs.rs/bevy/0.10.0/bevy/ecs/system/trait.System.html"><code>Systems</code></a> (which are just <a href="https://github.com/bevyengine/bevy/tree/v0.10.0/crates/bevy_ecs#systems">normal Rust functions!</a>) are how you define game logic in Bevy ECS. With <strong>Schedule v3</strong>, you can add systems to your <a href="https://docs.rs/bevy/0.10.0/bevy/app/struct.App.html"><code>App</code></a> just like you did in previous versions:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>gravity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>However <strong>Schedule v3</strong> has some new tricks up its sleeve! You can now add multiple systems at once:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>apply_acceleration<span class="z-punctuation z-separator z-rust">,</span> apply_velocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>By default, Bevy runs systems in parallel to each other. In previous versions of Bevy, you ordered systems like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>walk<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">before</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>jump</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>jump</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>collide<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>jump</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>You can still do that! But you can now compress this using <code>add_systems</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> much cleaner! +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + walk<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">before</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>jump</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + jump<span class="z-punctuation z-separator z-rust">,</span> + collide<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>jump</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p><code>before()</code> and <code>after()</code> are definitely useful tools! However, thanks to the new <code>chain()</code> function, it is now <em>much easier</em> to run systems in a specific order:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This is equivalent to the previous example +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>walk<span class="z-punctuation z-separator z-rust">,</span> jump<span class="z-punctuation z-separator z-rust">,</span> collide</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">chain</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p><code>chain()</code> will run the systems in the order they were defined. Chaining also pairs with per-system configuration:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>walk<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>input</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> jump<span class="z-punctuation z-separator z-rust">,</span> collide</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">chain</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h3 id="configurable-system-sets">Configurable System Sets +<a class="anchor-link" href="#configurable-system-sets">#</a> +</h3> +<p>In <strong>Schedule v3</strong>, the idea of the &quot;system set&quot; has been redefined to support more natural and flexible control over how systems are run and scheduled. The old &quot;system label&quot; concept has been combined with the &quot;set&quot; concept, resulting in one straightforward but powerful abstraction.</p> +<p><a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/trait.SystemSet.html"><code>SystemSets</code></a> are named collections of systems that share system configuration across all of their members. Ordering systems relative to a <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/trait.SystemSet.html"><code>SystemSet</code></a> applies that ordering to <em>all</em> systems in that set, in addition to any configuration on each individual system.</p> +<p>Let's jump right into what this would look like. You define <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/trait.SystemSet.html"><code>SystemSets</code></a> like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">SystemSet<span class="z-punctuation z-separator z-rust">,</span> Debug<span class="z-punctuation z-separator z-rust">,</span> Hash<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Eq<span class="z-punctuation z-separator z-rust">,</span> Clone</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">PhysicsSet</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + Movement<span class="z-punctuation z-separator z-rust">,</span> + CollisionDetection<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>You can add systems to sets by calling the <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/trait.IntoSystemConfig.html#method.in_set"><code>in_set</code></a> method:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>gravity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSet<span class="z-punctuation z-accessor z-rust">::</span></span>Movement</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>You can combine this with the new system features mentioned above:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>apply_acceleration<span class="z-punctuation z-separator z-rust">,</span> apply_velocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">chain</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSet<span class="z-punctuation z-accessor z-rust">::</span></span>Movement</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Systems can belong to any number of sets:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + move_player + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">MoveSet<span class="z-punctuation z-accessor z-rust">::</span></span>Player</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSet<span class="z-punctuation z-accessor z-rust">::</span></span>Movement</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Configuration is added to sets like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">configure_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Run systems in the Movement set before systems in the CollisionDetection set +</span> <span class="z-meta z-path z-rust">PhysicsSet<span class="z-punctuation z-accessor z-rust">::</span></span>Movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">before</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSet<span class="z-punctuation z-accessor z-rust">::</span></span>CollisionDetection</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Sets can be nested inside other sets, which will cause them to inherit the configuration of their parent set:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">configure_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">MoveSet<span class="z-punctuation z-accessor z-rust">::</span></span>Enemy<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSet<span class="z-punctuation z-accessor z-rust">::</span></span>Movement</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Sets can be configured multiple times:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> In PlayerPlugin: +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">configure_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">MoveSet<span class="z-punctuation z-accessor z-rust">::</span></span>Player<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">before</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">MoveSet<span class="z-punctuation z-accessor z-rust">::</span></span>Enemy</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> In PlayerTeleportPlugin +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">configure_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">MoveSet<span class="z-punctuation z-accessor z-rust">::</span></span>Player<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PortalSet<span class="z-punctuation z-accessor z-rust">::</span></span>Teleport</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Crucially system configuration is strictly additive: you cannot <em>remove</em> rules added elsewhere. This is both an &quot;anti-spaghetti&quot; and &quot;plugin privacy&quot; consideration. When this rule is combined with Rust's robust type privacy rules, plugin authors can make careful decisions about which exact invariants need to be upheld, and reorganize code and systems internally without breaking consumers.</p> +<p>Configuration rules <em>must be compatible with each other</em>: any paradoxes (like a system set inside of itself, a system that must run both before and after a set, order cycles, etc) will result in a runtime panic with a helpful error message.</p> +<h3 id="directly-schedule-exclusive-systems">Directly Schedule Exclusive Systems +<a class="anchor-link" href="#directly-schedule-exclusive-systems">#</a> +</h3> +<p>&quot;Exclusive systems&quot; are <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/system/trait.System.html"><code>Systems</code></a> that have mutable direct access to the entire ECS <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/world/struct.World.html"><code>World</code></a>. For this reason, they cannot be run in parallel with other <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/system/trait.System.html"><code>Systems</code></a>.</p> +<p>Since Bevy's inception, Bevy devs have wanted to schedule exclusive systems (and flush commands) relative to normal systems.</p> +<p>Now you can! Exclusive systems can now be scheduled and ordered like any other system.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>ordinary_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This works! +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>exclusive_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>ordinary_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This is particularly powerful, as <strong>command flushes</strong> (which apply queued-up <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/system/struct.Commands.html"><code>Commands</code></a> added in systems to do things like spawn and despawn entities) are now simply performed in the <code>apply_system_buffers</code> exclusive system.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This system produces some commands +</span> system_a<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This will apply the queued commands from system_a +</span> apply_system_buffers<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This system will have access to the results of +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> system_a&#39;s commands +</span> system_b<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This chain ensures the systems above run in the order +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> they are defined +</span> </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">chain</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Do be careful with this pattern though: it's easy to quickly end up with many poorly ordered exclusive systems, creating bottlenecks and chaos.</p> +<p>What will you do with this much power? We're keen to find out!</p> +<h3 id="managing-complex-control-flow-with-schedules">Managing Complex Control Flow with Schedules +<a class="anchor-link" href="#managing-complex-control-flow-with-schedules">#</a> +</h3> +<p>But what if you want to do something <em>weird</em> with your <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/struct.Schedule.html"><code>Schedule</code></a>? Something non-linear, branching, or looping. What should you reach for?</p> +<p>It turns out, Bevy already <em>had</em> a great tool for this: schedules that run inside of an exclusive system. The idea is pretty simple:</p> +<ol> +<li>Construct a schedule, that stores whatever complex logic you want to run.</li> +<li>Store that schedule inside of a resource.</li> +<li>In an exclusive system, perform any arbitrary Rust logic you want to decide if and how your schedule runs.</li> +<li>Temporarily take the schedule out of the <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/world/struct.World.html"><code>World</code></a>, run it on the rest of the world to mutate both the schedule and the world, and then put it back in.</li> +</ol> +<p>With the addition of the new <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/struct.Schedules.html"><code>Schedules</code></a> resource and the <code>world.run_schedule()</code> API it's more ✨ ergonomic ✨ than ever.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> A Schedule! +</span><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> my_schedule <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">Schedule<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +schedule<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>my_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> A label for our new Schedule! +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">ScheduleLabel<span class="z-punctuation z-separator z-rust">,</span> Debug<span class="z-punctuation z-separator z-rust">,</span> Hash<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Eq<span class="z-punctuation z-separator z-rust">,</span> Clone</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MySchedule</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> An exclusive system to run this schedule +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">run_my_schedule</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">while</span> <span class="z-support z-function z-rust">very_complex_logic</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MySchedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Behold the ergonomics! +</span>app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MySchedule<span class="z-punctuation z-separator z-rust">,</span> my_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>run_my_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Bevy uses this pattern for five rather different things in <strong>Bevy 0.10</strong>:</p> +<ol> +<li><strong>Startup systems:</strong> these now live in their own schedule, which is run once at the start of the app.</li> +<li><strong>Fixed timestep systems:</strong> another schedule?! The exclusive system that runs this schedule accumulates time, running a while loop that repeatedly runs <code>CoreSchedule::FixedUpdate</code> until all of the accumulated time has been spent.</li> +<li><strong>Entering and exiting states:</strong> a bonanza of schedules. Each collection of systems that runs logic to enter and exit a state variant is stored in its own schedule, which is called based on the change in state in the <code>apply_state_transitions::&lt;S&gt;</code> exclusive system.</li> +<li><strong>Rendering:</strong> all rendering logic is stored in its own schedule to allow it to run asynchronously relative to gameplay logic.</li> +<li><strong>Controlling the outermost loop:</strong> in order to handle the &quot;startup schedule first, then main schedule&quot; logic, we wrap it all up in a minimal overhead <code>CoreSchedule::Outer</code> and then run our schedules as the sole exclusive system there.</li> +</ol> +<p>Follow the breadcrumbs starting at <a href="https://docs.rs/bevy/0.10.0/bevy/app/enum.CoreSchedule.html"><code>CoreSchedule</code></a> for more info.</p> +<h3 id="run-conditions">Run Conditions +<a class="anchor-link" href="#run-conditions">#</a> +</h3> +<p><a href="https://docs.rs/bevy/0.10.0/bevy/ecs/system/trait.System.html"><code>Systems</code></a> can have any number of <strong>run conditions</strong>, which are &quot;just&quot; systems that return a <code>bool</code>. If the <code>bool</code>s returned by <em>all</em> of a system's <strong>run conditions</strong> are <code>true</code>, the system will run. Otherwise the system will be skipped for the current run of the schedule:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Let&#39;s make our own run condition +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">game_win_condition</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">score</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Score<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> <span class="z-storage z-type z-rust">bool</span></span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> player <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">single</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + player<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">is_alive</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-logical z-rust">&amp;&amp;</span> score<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span> <span class="z-keyword z-operator z-comparison z-rust">&gt;</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">9000</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>win_game<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run_if</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>game_win_condition</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><strong>Run conditions</strong> also have a number of &quot;combinator&quot; operations, thanks to <a href="https://github.com/bevyengine/bevy/pull/7547">@JoJoJet</a> and <a href="https://github.com/bevyengine/bevy/pull/7559">@Shatur</a>:</p> +<p>They can be negated with <code>not()</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>continue_game<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run_if</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-support z-function z-rust">not</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>game_win_condition</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>They can also be combined with <code>and_then</code> and <code>or_else</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>move_player<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run_if</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>is_alive<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">or_else</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>is_zombie</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Bevy 0.10 is shipping with a lovely collection of built-in <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/common_conditions/index.html">common run conditions</a>. You can easily run systems if there are events to process, timers that elapsed, resources that changed, input state changes, states that changed, and more (thanks to <a href="https://github.com/bevyengine/bevy/pull/6587"><code>@maniwani</code></a>, <a href="https://github.com/bevyengine/bevy/pull/7579"><code>@inodentry</code></a>, <a href="https://github.com/bevyengine/bevy/pull/7806"><code>@jakobhellermann</code></a>, and <a href="https://github.com/bevyengine/bevy/pull/7866"><code>@jabuwu</code></a>).</p> +<p><strong>Run conditions</strong> can also serve as a lightweight optimization tool. Run conditions are evaluated on the main thread, and each run criteria is evaluated exactly once each schedule update, at the time of the first system in the set that relies on it. Systems disabled by run conditions don't spawn a task, which can add up across many systems. Like always though: benchmark!</p> +<p><strong>Run conditions</strong> have replaced the &quot;run criteria&quot; in previous versions of Bevy. We can finally get rid of the dreaded &quot;looping run criteria&quot;! <a href="https://docs.rs/bevy/0.9.1/bevy/ecs/schedule/enum.ShouldRun.html"><code>ShouldRun::YesAndCheckAgain</code></a> was not exactly straightforward to reason about, either for engine devs or users. It's always a bad sign when your bool-like enums have four possible values. If you crave more complex control flow: use the &quot;schedules in exclusive systems&quot; pattern in the <a href="https://bevyengine.org/news/bevy-0-10/#directly-schedule-exclusive-systems">section above</a>. For the other 99% of use cases, enjoy the simpler <code>bool</code>-based run conditions!</p> +<h3 id="simpler-states">Simpler States +<a class="anchor-link" href="#simpler-states">#</a> +</h3> +<p><strong>Schedule v3</strong> adds a new, much simpler &quot;state system&quot;. <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/trait.States.html"><code>States</code></a> allow you to easily configure different <a href="https://docs.rs/bevy/0.10.0/bevy/app/struct.App.html"><code>App</code></a> logic to run based on the current &quot;state&quot; of the <a href="https://docs.rs/bevy/0.10.0/bevy/app/struct.App.html"><code>App</code></a>.</p> +<p>You define <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/trait.States.html"><code>States</code></a> like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">States<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Eq<span class="z-punctuation z-separator z-rust">,</span> Debug<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> Hash<span class="z-punctuation z-separator z-rust">,</span> Default</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">AppState</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">default</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + MainMenu<span class="z-punctuation z-separator z-rust">,</span> + InGame<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Each variant of the enum corresponds to a different state the <a href="https://docs.rs/bevy/0.10.0/bevy/app/struct.App.html"><code>App</code></a> can be in.</p> +<p>You add <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/trait.States.html"><code>States</code></a> to your <a href="https://docs.rs/bevy/0.10.0/bevy/app/struct.App.html"><code>App</code></a> like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">add_state<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AppState<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This will setup your <a href="https://docs.rs/bevy/0.10.0/bevy/app/struct.App.html"><code>App</code></a> to use the given state. It adds the <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/struct.State.html"><code>State</code></a> resource, which can be used to find the current state the <a href="https://docs.rs/bevy/0.10.0/bevy/app/struct.App.html"><code>App</code></a> is in:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">check_state</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">state</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">State<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AppState<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">info!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>We are in the {} state<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> state<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Additionally, <code>add_state</code> will create an <code>OnUpdate</code> set for each possible value, which you can then add your systems to. These sets run as part of the normal app update, but only when the app is in a given state:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_systems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>main_menu<span class="z-punctuation z-separator z-rust">,</span> start_game</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>OnUpdate<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>MainMenu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>fun_gameplay<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>OnUpdate<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>InGame</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>It will also create <code>OnEnter</code> and <code>OnExit</code> schedules for each state, which will only run when transitioning from one state to another:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>load_main_menu<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>OnEnter<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>MainMenu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>cleanup_main_menu<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_schedule</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>OnExit<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>MainMenu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p><code>add_state</code> also adds the <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/struct.NextState.html"><code>NextState</code></a> resource, which can be used to queue a state change:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">start_game</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-variable z-parameter z-rust">button_query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Interaction, <span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>StartGameButton<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">next_state</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">NextState<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AppState<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"></span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> button_query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">single</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-comparison z-rust">==</span> <span class="z-meta z-path z-rust">Interaction<span class="z-punctuation z-accessor z-rust">::</span></span>Pressed <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + next_state<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>InGame</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>This replaces Bevy's previous state system, which was very hard to deal with. It had state stacks, elaborate queued transitions, and error handling (that most people just unwrapped). The state stack was very complex to learn, very prone to exasperating bugs, and mostly ignored.</p> +<p>As a result, in <strong>Bevy 0.10</strong> states are now &quot;stackless&quot;: only one queued state of each type at a time. After lots of alpha testing, we're reasonably confident that this shouldn't be too bad to migrate away from. If you were relying on the state stack, you have plenty of options:</p> +<ul> +<li>Build the &quot;stack&quot; logic on top of the core state system</li> +<li>Split your state into multiple states, which capture orthogonal elements of your app's status</li> +<li>Build your own state stack abstraction using the same patterns as Bevy's first-party version. None of the new state logic is hard coded! If you build something, <a href="/assets">let the rest of the community know</a> so you can collaborate!</li> +</ul> +<h3 id="base-sets-getting-default-behavior-right">Base Sets: Getting Default Behavior Right +<a class="anchor-link" href="#base-sets-getting-default-behavior-right">#</a> +</h3> +<p>An astute reader may point out that:</p> +<ol> +<li>Bevy automatically runs its systems in parallel.</li> +<li><a href="https://github.com/bevyengine/bevy/blob/latest/examples/ecs/nondeterministic_system_order.rs">The order of systems is nondeterministic unless there is an explicit ordering relationship between them</a></li> +<li>All of the systems are now stored in a single <code>Schedule</code> object with no barriers between them</li> +<li>Systems can belong to any number of system sets, each of which can add their own behavior</li> +<li>Bevy is a powerful engine with many internal systems.</li> +</ol> +<p>Won't this lead to utter chaos and tedious spaghetti-flavored work to resolve every last ordering ambiguity? +Many users <em>liked</em> stages, they were helpful for understanding the structure of an <a href="https://docs.rs/bevy/0.10.0/bevy/app/struct.App.html"><code>App</code></a>!</p> +<p>Well, we're glad you asked, rhetorical skeptic. To reduce this chaos (and ease migration), <strong>Bevy 0.10</strong> comes with a brand new collection of system sets provided by <a href="https://docs.rs/bevy/0.10.0/bevy/struct.DefaultPlugins.html"><code>DefaultPlugins</code></a>: <a href="https://docs.rs/bevy/0.10.0/bevy/app/enum.CoreSet.html"><code>CoreSet</code></a>, <a href="https://docs.rs/bevy/0.10.0/bevy/app/enum.StartupSet.html"><code>StartupSet</code></a>, and <a href="https://docs.rs/bevy/0.10.0/bevy/render/enum.RenderSet.html"><code>RenderSet</code></a>. The similarity of their names to the old <a href="https://docs.rs/bevy/0.9.1/bevy/app/enum.CoreStage.html"><code>CoreStage</code></a>, <a href="https://docs.rs/bevy/0.9.1/bevy/app/enum.StartupStage.html"><code>StartupStage</code></a>, and <a href="https://docs.rs/bevy/0.9.1/bevy/render/enum.RenderStage.html"><code>RenderStage</code></a> is not a coincidence. Much like stages, there are command flush points between each set, and existing systems have been migrated directly.</p> +<p>Some parts of the stage-centric architecture were appealing: a clear high-level structure, coordination on flush points (to reduce excessive bottlenecks), and good default behavior. +To keep those bits (while excising the frustrating ones), we've introduced the concept of <strong>Base Sets</strong> (<a href="https://github.com/bevyengine/bevy/pull/7466">added by @cart</a>). <strong>Base Sets</strong> are just normal <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/trait.SystemSet.html"><code>SystemSets</code></a>, except:</p> +<ol> +<li>Every system can belong to at most one base set.</li> +<li>Systems that do not specify a base set will be added to the default base set for the schedule (if the schedule has one).</li> +</ol> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> You define base sets exactly like normal sets, with the +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> addition of the system_set(base) attribute +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Debug<span class="z-punctuation z-separator z-rust">,</span> Hash<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Eq<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> SystemSet</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">system_set</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">base</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">MyBaseSet</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + Early<span class="z-punctuation z-separator z-rust">,</span> + Late<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This ends up in CoreSet::Update by default +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>no_explicit_base_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> You must use .in_base_set rather than .in_set for explicitness +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This is a high-impact decision! +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>post_update<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_base_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">CoreSet<span class="z-punctuation z-accessor z-rust">::</span></span>PostUpdate</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Look, it works! +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>custom_base_set<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_base_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">MyBaseSet<span class="z-punctuation z-accessor z-rust">::</span></span>Early</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Ordering your base sets relative to CoreSet is probably wise +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">configure_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">MyBaseSet<span class="z-punctuation z-accessor z-rust">::</span></span>Early<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">before</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">CoreSet<span class="z-punctuation z-accessor z-rust">::</span></span>Update</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">configure_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">MyBaseSet<span class="z-punctuation z-accessor z-rust">::</span></span>Late<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">CoreSet<span class="z-punctuation z-accessor z-rust">::</span></span>Update</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Let me tell you a story, set in a world without <strong>Base Sets</strong>:</p> +<ol> +<li>A new user adds the <code>make_player_run</code> system to their app.</li> +<li>Sometimes this system runs before input handling, leading to randomly dropped inputs. Sometimes it runs after rendering, leading to strange flickers.</li> +<li>After much frustration, the user discovers that these are due to &quot;system execution order ambiguities&quot;.</li> +<li>The user runs a specialized detection tool, digs into the source code of the engine, figures out what order their system should run in relative to the engine's system sets, and then continues on their merry way, doing this for each new system.</li> +<li>Bevy (or one of their third-party plugins) updates, breaking all of our poor users system ordering once again.</li> +</ol> +<p>The clear problem this illustrates is that <em>most</em> gameplay systems should not need to know or care about &quot;internal systems&quot;.</p> +<p>We've found that in practice, there are three broad classes of systems: gameplay logic (the majority of all end user systems), stuff that needs to happen before gameplay logic (like event cleanup and input handling), and stuff that needs to happen after gameplay logic (like rendering and audio).</p> +<p>By broadly ordering the schedule via <strong>Base Sets</strong>, Bevy apps can have good default behavior and clear high-level structure without compromising on the scheduling flexibility and explicitness that advanced users crave. +Let us know how it works out for you!</p> +<h3 id="improved-system-ambiguity-detection">Improved System Ambiguity Detection +<a class="anchor-link" href="#improved-system-ambiguity-detection">#</a> +</h3> +<p>When multiple systems interact with an ECS resource in conflicting ways, but don't have an ordering constraint between them, we call this an &quot;ambiguity&quot;. If your <a href="https://docs.rs/bevy/0.10.0/bevy/app/struct.App.html"><code>App</code></a> has ambiguities, this can cause bugs. We've significantly improved our ambiguity reporting, which can be configured in the new <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/struct.ScheduleBuildSettings.html"><code>ScheduleBuildSettings</code></a>. Check out the docs for more info. If you haven't tried this out on your app yet: you should take a look!</p> +<h3 id="single-threaded-execution">Single Threaded Execution +<a class="anchor-link" href="#single-threaded-execution">#</a> +</h3> +<p>You can now easily switch a <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/struct.Schedule.html"><code>Schedule</code></a> to single-threaded evaluation via the <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/schedule/struct.SingleThreadedExecutor.html"><code>SingleThreadedExecutor</code></a> for users who don't want or need parallelism.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">schedule<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set_executor_kind</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">ExecutorKind<span class="z-punctuation z-accessor z-rust">::</span></span>SingleThreaded</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="cascaded-shadow-maps">Cascaded Shadow Maps +<a class="anchor-link" href="#cascaded-shadow-maps">#</a> +</h2> +<div class="release-feature-authors">authors: @danchia, Rob Swain (@superdump)</div> +<p>Bevy uses &quot;shadow maps&quot; to cast shadows for lights / objects. Previous versions of Bevy used a simple but limited shadow map implementation for directional light sources. For a given light, you would define the resolution of the shadow map <em>and</em> a manual &quot;view projection&quot; that would determine how the shadow is cast. This had a number of downsides:</p> +<ul> +<li>The resolution of the shadow map was fixed. You had to choose something between &quot;cover a large area, but have a lower resolution&quot; and &quot;cover a smaller area, but have a higher resolution&quot;.</li> +<li>The resolution didn't adapt to camera positioning. Shadows might look great in one position, but terrible in another position.</li> +<li>The &quot;shadow projection&quot; had to be manually defined. This made it hard and unapproachable to configure shadows to match a given scene.</li> +</ul> +<p><strong>Bevy 0.10</strong> adds &quot;cascaded shadow maps&quot;, which breaks up the camera's view frustum into a series of configurable &quot;cascades&quot;, which each have their own shadow map. This enables shadows in the cascade &quot;close to the camera&quot; to be highly detailed, while allowing shadows &quot;far from the camera&quot; to cover a wider area with less detail. Because it uses the camera's view frustum to define the shadow projections, the shadow quality remains consistent as the camera moves through the scene. This also means that users don't need to manually configure shadow projections anymore. They are automatically calculated!</p> +<p><video controls loop><source src="shadow_cascades.mp4" type="video/mp4"/></video></p> +<p>Notice how the nearby shadows are highly detailed whereas the shadows in the distance become less detailed as they get farther away (which doesn't matter as much because they are far away).</p> +<p>While shadow cascades solve important problems, they also introduce new ones. How many cascades should you use? What is the minimum and maximum distance from the camera where shadows should appear? How much overlap should there be between cascades? Be sure to dial in these parameters to fit your scenes.</p> +<h2 id="environment-map-lighting">Environment Map Lighting +<a class="anchor-link" href="#environment-map-lighting">#</a> +</h2> +<div class="release-feature-authors">authors: @JMS55</div> +<p>Environment maps are a popular and computationally cheap way to significantly improve the quality of a scene's lighting. It uses a cube map texture to provide 360 degree lighting &quot;from all directions&quot;. This is especially apparent for reflective surfaces, but it applies to all lit materials.</p> +<p>This is what the PBR material looks like without environment map lighting:</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/env_map_before.png" alt="env map before" /></p> +<p>And this is what the PBR material looks like with environment map lighting:</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/env_map_after.png" alt="env map after" /></p> +<p>For scenes that need constant lighting (especially outdoor scenes), environment maps are a great solution. And because environment maps are arbitrary images, artists have a lot of control over the character of the scene's lighting.</p> +<h2 id="depth-and-normal-prepass">Depth and Normal Prepass +<a class="anchor-link" href="#depth-and-normal-prepass">#</a> +</h2> +<div class="release-feature-authors">authors: @icesentry, Rob Swain (@superdump), @robtfm, @JMS55</div> +<p><video controls loop><source src="force_field.mp4" type="video/mp4"/></video></p> +<p class="release-feature-authors">This effect uses the depth from the prepass to find the intersection between the ground and the force field</p> +<p>Bevy now has the ability to run a depth and/or normal prepass. This means the depth and normal textures will be generated in a render pass that runs before the main pass and can therefore be used during the main pass. This enables various special effects like Screen Space Ambient Occlusion, Temporal Anti Aliasing, and many more. These are currently being worked on and should be <a href="https://bevyengine.org/news/bevy-0-10/#what-s-next">available in the next release of Bevy</a>.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/edge_detection.png" alt="Edge detection" /></p> +<p class="release-feature-authors">In the image on the right, green lines are edges detected in the normal texture and blue lines are edges detected in the depth texture</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/edge_detection_prepass.png" alt="Edge detection prepass" /></p> +<p class="release-feature-authors">The depth and normal textures generated by the prepass</p> +<p>Using the prepass essentially means rendering everything twice. The prepass itself is much faster since it does a lot less work than the main pass. The result of the prepass can be used to reduce overdraw in the main pass, but if your scene didn't already suffer from overdraw then enabling the prepass will negatively affect performance. There are many things that can be done to improve this and we will keep working towards this goal. Like with anything performance related, make sure to measure it for your use case and see if it helps or not.</p> +<p>The prepass is still very useful when working on special effects that require a depth or normal texture, so if you want to use it you can simply add the <code>DepthPrepass</code> or <code>NormalPrepass</code> components to your camera.</p> +<h2 id="shadow-mapping-using-prepass-shaders">Shadow Mapping using Prepass Shaders +<a class="anchor-link" href="#shadow-mapping-using-prepass-shaders">#</a> +</h2> +<div class="release-feature-authors">authors: @geieredgar</div> +<p>Previously, the shader used for shadow mapping was hard-coded and had no knowledge of the material, only meshes. Now in <strong>Bevy 0.10</strong>, a <code>Material</code>'s depth prepass shaders are used for shadow mapping. This means that the shaders used to do the shadow mapping for a <code>Material</code> are customizable!</p> +<p>As a bonus, the availability of <code>Material</code> information during shadow mapping means that we could instantly enable alpha mask shadows allowing foliage to cast shadows according to the alpha values in their texture rather than only based on their geometry.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/alpha_mask_shadows.png" alt="Alpha mask shadows" /></p> +<div style="font-size: 1.0rem" class="release-feature-authors"><a href="https://developer.nvidia.com/orca/nvidia-emerald-square">NVIDIA ORCA Emerald Square scene</a> (<a href="https://creativecommons.org/licenses/by-nc-sa/3.0/">CC BY-NC-SA 3.0</a>) with alpha mask shadow support</div> +<h2 id="smooth-skeletal-animation-transitions">Smooth Skeletal Animation Transitions +<a class="anchor-link" href="#smooth-skeletal-animation-transitions">#</a> +</h2> +<div class="release-feature-authors">authors: @smessmer</div> +<p>You can now smoothly transition between two (or more) skeletal animations!</p> +<p><video controls loop><source src="animation_transition.mp4" type="video/mp4"/></video></p> +<div style="font-size: 1.0rem" class="release-feature-authors">Character model and animations are royalty free assets from Mixamo. +</div> +<p>With the new <a href="https://docs.rs/bevy/0.10/bevy/animation/struct.AnimationPlayer.html#method.play_with_transition"><code>play_with_transition</code></a> method on the <a href="https://docs.rs/bevy/0.10.0/bevy/animation/struct.AnimationPlayer.html"><code>AnimationPlayer</code></a> component, you can now specify a transition duration during which the new animation will be linearly blended with the currently playing animation, whose weight will decrease during that duration until it reaches <code>0.0</code>.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component<span class="z-punctuation z-separator z-rust">,</span> Default</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">ActionTimer</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Timer</span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Animations</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">run</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AnimationClip<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">attack</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AnimationClip<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">run_or_attack</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> AnimationPlayer, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> ActionTimer, <span class="z-keyword z-operator z-rust">&amp;</span>Animations<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">keyboard_input</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Input<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>KeyCode<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">animation_clips</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AnimationClip<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> animation_player<span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-modifier z-rust">mut</span> timer<span class="z-punctuation z-separator z-rust">,</span> animations</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Trigger the attack animation when pressing &lt;space&gt; +</span> <span class="z-keyword z-control z-rust">if</span> keyboard_input<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">just_pressed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">KeyCode<span class="z-punctuation z-accessor z-rust">::</span></span>Space</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> clip <span class="z-keyword z-operator z-assignment z-rust">=</span> animation_clips<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>animations<span class="z-punctuation z-accessor z-dot z-rust">.</span>attack</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Set a timer for when to restart the run animation +</span> timer<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">Timer<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-path z-rust">Duration<span class="z-punctuation z-accessor z-rust">::</span></span>from_secs_f32<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>clip<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">duration</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-arithmetic z-rust">-</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">TimerMode<span class="z-punctuation z-accessor z-rust">::</span></span>Once<span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Will transition over half a second to the attack animation +</span> animation_player + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play_with_transition</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>animations<span class="z-punctuation z-accessor z-dot z-rust">.</span>attack<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Duration<span class="z-punctuation z-accessor z-rust">::</span></span>from_secs_f32<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + <span class="z-keyword z-control z-rust">if</span> timer<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-support z-function z-rust">tick</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">delta</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">just_finished</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Once the attack animation is finished, restart the run animation +</span> animation_player + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play_with_transition</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>animations<span class="z-punctuation z-accessor z-dot z-rust">.</span>run<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Duration<span class="z-punctuation z-accessor z-rust">::</span></span>from_secs_f32<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">repeat</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="improved-android-support">Improved Android Support +<a class="anchor-link" href="#improved-android-support">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf, @slyedoc</div> +<p><img src="https://bevyengine.org/news/bevy-0-10/android%20emulator.png" alt="Android emulator running Bevy" /></p> +<p>Bevy now runs out of the box on Android on more devices. This was unlocked by waiting for the <a href="https://docs.rs/winit/0.28/winit/event/enum.Event.html#variant.Resumed"><code>Resumed</code></a> event to create the window instead of doing it on startup, matching the <a href="https://developer.android.com/guide/components/activities/activity-lifecycle#onresume"><code>onResume()</code></a> callback on Android.</p> +<p>To follow the recommendations on the <a href="https://docs.rs/winit/0.28/winit/event/enum.Event.html#variant.Suspended"><code>Suspended</code></a> event, Bevy will now exit on receiving that event. This is a temporary solution until Bevy is able to recreate rendering resources when being resumed.</p> +<p>Please test on your devices and report successes or issues you may encounter! There is a known issue around touch position on some devices with software buttons, as winit doesn't expose (<a href="https://github.com/rust-windowing/winit/issues/2308">yet</a>) the inset size, only the inner size.</p> +<p>As this brings Bevy closer to full support of Android, there isn't a need anymore for separate examples for Android and iOS. They have been regrouped in one <a href="https://github.com/bevyengine/bevy/tree/v0.10.0/examples/mobile">&quot;mobile&quot; example</a>, and the instructions updated (<a href="https://github.com/bevyengine/bevy/tree/v0.10.0/examples#android">for Android</a> and <a href="https://github.com/bevyengine/bevy/tree/v0.10.0/examples#ios">for iOS</a>).</p> +<p>Here is the same example running on iOS!</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/ios%20emulator.png" alt="iOS emulator running Bevy" /></p> +<h2 id="revamped-bloom">Revamped Bloom +<a class="anchor-link" href="#revamped-bloom">#</a> +</h2> +<div class="release-feature-authors">authors: @StarLederer, @JMS55</div> +<p>Bloom has undergone some major changes and now looks better, is easier to control, and has fewer visual artifacts. +In combination with the new tonemapping options, bloom has been much improved since the previous release!</p> +<ol> +<li>In Bevy 0.9, bloom looked like this.</li> +<li>Switching the tonemapper to something like <code>AcesFitted</code> is already a big improvement.</li> +<li>In Bevy 0.10, bloom now looks like this. It's much more controlled and less overbearing.</li> +<li>To make the bloom stronger, rather than raise the <code>BloomSettings</code> intensity, +let's double the <code>emissive</code> value of each cube.</li> +<li>Finally, if you want more extreme bloom similar to the old algorithm, you can change +<code>BloomSettings::composite_mode</code> from <code>BloomCompositeMode::EnergyConserving</code> to <code>BloomCompositeMode::Additive</code>.</li> +<li>Explore the new bloom settings in an interactive playground using the new <code>bloom_3d</code> (and <code>bloom_2d</code>) examples.</li> +</ol> +<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); grid-gap: 16px;"> + <div style="position: relative;"> + <div style="position: absolute; top: 0; left: 0; background-color: black; color: white; border-radius: 10px 0 10px 0; width: 30px; height: 30px; padding: 2px; box-shadow: 2px 2px 4px rgba(0,0,0,0.3); text-align: center; opacity: 0.8;">1</div> + <img src="old_bloom.png" style="width: 100%; height: auto;"/> + </div> + <div style="position: relative;"> + <div style="position: absolute; top: 0; left: 0; background-color: black; color: white; border-radius: 10px 0 10px 0; width: 30px; height: 30px; padding: 2px; box-shadow: 2px 2px 4px rgba(0,0,0,0.3); text-align: center; opacity: 0.8;">2</div> + <img src="old_bloom_aces.png" style="width: 100%; height: auto;"/> + </div> + <div style="position: relative;"> + <div style="position: absolute; top: 0; left: 0; background-color: black; color: white; border-radius: 10px 0 10px 0; width: 30px; height: 30px; padding: 2px; box-shadow: 2px 2px 4px rgba(0,0,0,0.3); text-align: center; opacity: 0.8;">3</div> + <img src="new_bloom.png" style="width: 100%; height: auto;"/> + </div> + <div style="position: relative;"> + <div style="position: absolute; top: 0; left: 0; background-color: black; color: white; border-radius: 10px 0 10px 0; width: 30px; height: 30px; padding: 2px; box-shadow: 2px 2px 4px rgba(0,0,0,0.3); text-align: center; opacity: 0.8;">4</div> + <img src="new_bloom_double_emission.png" style="width: 100%; height: auto;"/> + </div> + <div style="position: relative;"> + <div style="position: absolute; top: 0; left: 0; background-color: black; color: white; border-radius: 10px 0 10px 0; width: 30px; height: 30px; padding: 2px; box-shadow: 2px 2px 4px rgba(0,0,0,0.3); text-align: center; opacity: 0.8;">5</div> + <img src="new_bloom_additive.png" style="width: 100%; height: auto;"/> + </div> + <div style="position: relative;"> + <div style="position: absolute; top: 0; left: 0; background-color: black; color: white; border-radius: 10px 0 10px 0; width: 30px; height: 30px; padding: 2px; box-shadow: 2px 2px 4px rgba(0,0,0,0.3); text-align: center; opacity: 0.8;">6</div> + <img src="bloom_example.png" style="width: 100%; height: auto;"/> + </div> + </div> +<h2 id="distance-and-atmospheric-fog">Distance and Atmospheric Fog +<a class="anchor-link" href="#distance-and-atmospheric-fog">#</a> +</h2> +<div class="release-feature-authors">author: Marco Buono (@coreh)</div> +<p>Bevy can now render distance and atmospheric fog effects, bringing a heightened sense of <em>depth</em> and <em>ambiance</em> to your scenes by making objects appear dimmer the further away they are from view.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/fog.png" alt="The new fog example showcases different fog modes and parameters." /></p> +<p>Fog is controllable per camera via the new <a href="https://docs.rs/bevy/0.10.0/bevy/pbr/struct.FogSettings.html"><code>FogSettings</code></a> component. Special care has been put into exposing several knobs to give you full artistic control over the look of your fog, including the ability to fade the fog in and out by controlling the alpha channel of the fog color.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-path z-rust">Camera3dBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + FogSettings <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + color<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgba<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">1</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">2</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">4</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + falloff<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">FogFalloff<span class="z-punctuation z-accessor z-rust">::</span></span>Linear <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> start<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">50.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> end<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">100.</span><span class="z-constant z-numeric z-float z-rust">0</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><em>Exactly how</em> fog behaves with regard to distance is controlled via the <a href="https://docs.rs/bevy/0.10.0/bevy/pbr/enum.FogFalloff.html"><code>FogFalloff</code></a> enum. All of the “traditional” fog falloff modes from the fixed-function OpenGL 1.x / DirectX 7 days are supported:</p> +<p><code>FogFalloff::Linear</code> increases in intensity linearly from 0 to 1 between <code>start</code> and <code>end</code> parameters. (This example uses values of 0.8 and 2.2, respectively.)</p> +<svg width="370" height="212" viewBox="0 0 370 212" fill="none"> +<path d="M331 151H42V49" stroke="currentColor" stroke-width="2"/> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-family="Inter" font-size="12" letter-spacing="0em"><tspan x="136" y="173.864">1</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-family="Inter" font-size="12" letter-spacing="0em"><tspan x="30" y="53.8636">1</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-family="Inter" font-size="12" letter-spacing="0em"><tspan x="42" y="173.864">0</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-family="Inter" font-size="12" letter-spacing="0em"><tspan x="232" y="173.864">2</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-family="Inter" font-size="12" letter-spacing="0em"><tspan x="332" y="173.864">3</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-family="Inter" font-size="12" letter-spacing="0em"><tspan x="161" y="190.864">distance</tspan></text> +<text font-family="sans-serif" transform="translate(10 132) rotate(-90)" fill="currentColor" style="white-space: pre" font-family="Inter" font-size="12" letter-spacing="0em"><tspan x="0" y="11.8636">fog intensity</tspan></text> +<path d="M43 150H117.227L263 48H331" stroke="#FF00E5"/> +<path d="M118 151V49" stroke="#FF00E5" stroke-dasharray="1 4"/> +<path d="M263 151V49" stroke="#FF00E5" stroke-dasharray="1 4"/> +<text font-family="sans-serif" fill="#FF00E5" style="white-space: pre" font-family="Inter" font-size="10" letter-spacing="0em"><tspan x="121" y="58.6364">start</tspan></text> +<text font-family="sans-serif" fill="#FF00E5" style="white-space: pre" font-family="Inter" font-size="10" letter-spacing="0em"><tspan x="267" y="58.6364">end</tspan></text> +</svg> +<p><code>FogFalloff::Exponential</code> increases according to an (inverse) exponential formula, controlled by a <code>density</code> parameter.</p> +<svg width="370" height="212" viewBox="0 0 370 212" fill="none"> +<mask id="mask0_3_31" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="42" y="42" width="286" height="108"> +<rect x="42" y="42" width="286" height="108" fill="#D9D9D9"/> +</mask> +<g mask="url(#mask0_3_31)"> +<path d="M42 150C42 150 98.3894 53 254.825 53L662 53" stroke="#FF003D" stroke-width="1"/> +<path d="M42 150C42 150 139.499 53 409.981 53L1114 53" stroke="#001AFF" stroke-width="1"/> +<path d="M42 150C42 150 206.348 53 662.281 53L1849 53" stroke="#14FF00" stroke-width="1"/> +</g> +<path d="M331 151H42V49" stroke="currentColor" stroke-width="2"/> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="136" y="173.864">1</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="30" y="53.8636">1</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="42" y="173.864">0</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="232" y="173.864">2</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="332" y="173.864">3</tspan></text> +<text font-family="sans-serif" fill="#FF003D" style="white-space: pre" font-size="10" letter-spacing="0em"><tspan x="77" y="64.6364">density = 2</tspan></text> +<text font-family="sans-serif" fill="#001AFF" style="white-space: pre" font-size="10" letter-spacing="0em"><tspan x="236" y="76.6364">density = 1</tspan></text> +<text font-family="sans-serif" fill="#14FF00" style="white-space: pre" font-size="10" letter-spacing="0em"><tspan x="205" y="115.636">density = 0.5</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="161" y="190.864">distance</tspan></text> +<text font-family="sans-serif" transform="translate(10 132) rotate(-90)" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="0" y="11.8636">fog intensity</tspan></text> +</svg> +<p><code>FogFalloff::ExponentialSquared</code> grows according to a slightly modified (inverse) exponential square formula, also controlled by a <code>density</code> parameter.</p> +<svg width="370" height="212" viewBox="0 0 370 212" fill="none"> +<mask id="mask0_1_3" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="42" y="42" width="286" height="108"> +<rect x="42" y="42" width="286" height="108" fill="#D9D9D9"/> +</mask> +<g mask="url(#mask0_1_3)"> +<path d="M42 150C75.4552 150 74.9241 53.1724 166.262 53.1724L404 53.1724" stroke="#FF003D" stroke-width="1"/> +<path d="M42 150C107.986 150 106.939 53.1724 287.091 53.1724L756 53.1724" stroke="#001AFF" stroke-width="1"/> +<path d="M42 150C166.394 150 164.42 53.1724 504.035 53.1724L1388 53.1724" stroke="#14FF00" stroke-width="1"/> +</g> +<path d="M331 151H42V49" stroke="currentColor" stroke-width="2"/> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="136" y="173.864">1</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="30" y="53.8636">1</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="42" y="173.864">0</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="232" y="173.864">2</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="332" y="173.864">3</tspan></text> +<text font-family="sans-serif" fill="#FF003D" style="white-space: pre" font-size="10" letter-spacing="0em"><tspan x="61" y="54.6364">density = 2</tspan></text> +<text font-family="sans-serif" fill="#001AFF" style="white-space: pre" font-size="10" letter-spacing="0em"><tspan x="168" y="84.6364">density = 1</tspan></text> +<text font-family="sans-serif" fill="#14FF00" style="white-space: pre" font-size="10" letter-spacing="0em"><tspan x="174" y="121.636">density = 0.5</tspan></text> +<text font-family="sans-serif" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="161" y="190.864">distance</tspan></text> +<text font-family="sans-serif" transform="translate(10 132) rotate(-90)" fill="currentColor" style="white-space: pre" font-size="12" letter-spacing="0em"><tspan x="0" y="11.8636">fog intensity</tspan></text> +</svg> +<p>Additionally, a more sophisticated <code>FogFalloff::Atmospheric</code> mode is available which provides <em>more physically accurate</em> results by taking light <code>extinction</code> and <code>inscattering</code> into account separately.</p> +<p><a href="https://docs.rs/bevy/0.10.0/bevy/pbr/struct.DirectionalLight.html"><code>DirectionalLight</code></a> influence is also supported for all fog modes via the <code>directional_light_color</code> and <code>directional_light_exponent</code> parameters, mimicking the light dispersion effect seen in sunny outdoor environments.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/atmospheric-fog.png" alt="The new atmospheric_fog example showcases a terrain with atmospheric fog and directional light influence." /></p> +<p>Since directly controlling the non-linear fog falloff parameters “by hand” can be tricky to get right, a number of helper functions based on <a href="https://en.wikipedia.org/wiki/Visibility">meteorological visibility</a> are available, such as <a href="https://docs.rs/bevy/0.10.0/bevy/pbr/enum.FogFalloff.html#method.from_visibility"><code>FogFalloff::from_visibility()</code></a>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">FogSettings <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> objects retain visibility (&gt;= 5% contrast) for up to 15 units +</span> falloff<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">FogFalloff<span class="z-punctuation z-accessor z-rust">::</span></span>from_visibility<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">15.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>Fog is applied “forward rendering-style” on the PBR fragment shader, instead of as a post-processing effect, which allows it to properly handle semi-transparent meshes.</p> +<p>The atmospheric fog implementation is largely based on <a href="https://iquilezles.org/articles/fog/">this great article</a> by Inigo Quilez, Shadertoy co-creator, and computer graphics legend. <em>Thanks for the great write up and inspiration!</em></p> +<h2 id="standardmaterial-blend-modes">StandardMaterial Blend Modes +<a class="anchor-link" href="#standardmaterial-blend-modes">#</a> +</h2> +<div class="release-feature-authors">author: Marco Buono (@coreh)</div> +<p>The <a href="https://docs.rs/bevy/0.10.0/bevy/pbr/enum.AlphaMode.html"><code>AlphaMode</code></a> enum has been extended in <strong>Bevy 0.10</strong>, bringing support for <em>additive and multiplicative blending</em> to the <a href="https://docs.rs/bevy/0.10.0/bevy/pbr/struct.StandardMaterial.html"><code>StandardMaterial</code></a>. These two blend modes are staples of the “classic” (non physically-based) computer graphics toolbelt, and are commonly used to achieve a variety of effects.</p> +<p><video controls loop><source src="demo-ruins.mp4" type="video/mp4"/></video></p> +<p><em>Demo showcasing the use of blend modes to create stained glass and fire effects.</em> (<a href="https://github.com/coreh/bevy-demo-ruins">Source Code</a>)</p> +<p>Additionally, support for semi-transparent textures with <a href="https://en.wikipedia.org/wiki/Alpha_compositing#Straight_versus_premultiplied">premultiplied alpha</a> has been added, via a dedicated alpha mode.</p> +<p>Here's a high-level overview of the new modes:</p> +<ul> +<li><a href="https://docs.rs/bevy/0.10.0/bevy/pbr/enum.AlphaMode.html#variant.Add"><code>AlphaMode::Add</code></a> — Combines the colors of the fragments with the colors behind them in an additive process, (i.e. like light) producing <strong>brighter</strong> results. Useful for effects like fire, holograms, ghosts, lasers and other energy beams. Also known as <em>Linear Dodge</em> in graphics software.</li> +<li><a href="https://docs.rs/bevy/0.10.0/bevy/pbr/enum.AlphaMode.html#variant.Multiply"><code>AlphaMode::Multiply</code></a> — Combines the colors of the fragments with the colors behind them in a multiplicative process, (i.e. like pigments) producing <strong>darker</strong> results. Useful for effects approximating partial light transmission like stained glass, window tint film and some colored liquids.</li> +<li><a href="https://docs.rs/bevy/0.10.0/bevy/pbr/enum.AlphaMode.html#variant.Premultiplied"><code>AlphaMode::Premultiplied</code></a> — Behaves very similarly to <a href="https://docs.rs/bevy/0.10.0/bevy/pbr/enum.AlphaMode.html#variant.Blend"><code>AlphaMode::Blend</code></a>, but assumes the color channels have <strong>premultiplied alpha</strong>. Can be used to avoid discolored “outline” artifacts that can occur when using plain alpha-blended textures, or to cleverly create materials that combine additive and regular alpha blending in a single texture, thanks to the fact that for otherwise constant RGB values, <code>Premultiplied</code> behaves more like <code>Blend</code> for alpha values closer to 1.0, and more like <code>Add</code> for alpha values closer to 0.0.</li> +</ul> +<p><img src="https://bevyengine.org/news/bevy-0-10/blend-modes.png" alt="The new blend_modes example." /></p> +<p><strong>Note:</strong> Meshes using the new blend modes are drawn on the existing <code>Transparent3d</code> render phase, and therefore the same <em>z-sorting considerations/limitations</em> from <code>AlphaMode::Blend</code> apply.</p> +<h2 id="more-tonemapping-choices">More Tonemapping Choices +<a class="anchor-link" href="#more-tonemapping-choices">#</a> +</h2> +<div class="release-feature-authors">authors: @DGriffin91, @JMS55</div> +<p>Tonemapping is the process of transforming raw High Dynamic Range (HDR) information into actual &quot;screen colors&quot; using a &quot;display rendering transform&quot; (DRT). In previous versions of Bevy you had exactly two tonemapping options: Reinhard Luminance or none at all. In <strong>Bevy 0.10</strong> we've added a ton of choices!</p> +<h3 id="no-tonemapping">No Tonemapping +<a class="anchor-link" href="#no-tonemapping">#</a> +</h3> +<p>This is generally not recommended as HDR lighting is not intended to be used as color.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/tm_none.png" alt="no tonemapping" /></p> +<h3 id="reinhard">Reinhard +<a class="anchor-link" href="#reinhard">#</a> +</h3> +<p>A simple method that adapts to the color in a scene: <code>r = color / (1.0 + color)</code>. Lots of hue shifting, brights don't desaturate naturally. Bright primaries and secondaries don't desaturate at all.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/tm_reinhard.png" alt="reinhard" /></p> +<h3 id="reinhard-luminance">Reinhard Luminance +<a class="anchor-link" href="#reinhard-luminance">#</a> +</h3> +<p>A popular method similar to normal Reinhard that incorporates luminance. It adapts to the amount of light in a scene. This is what we had in previous versions of Bevy. It is still our default algorithm, but this will likely change in the future. Hues shift. Brights don't desaturate much at all across the spectrum.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/tm_reinhard_luminance.png" alt="reinhard luminance" /></p> +<h3 id="aces-fitted">ACES Fitted +<a class="anchor-link" href="#aces-fitted">#</a> +</h3> +<p>An extremely popular algorithm used in film and industry (ex: ACES is the default Unreal tonemapping algorithm). When people say &quot;filmic&quot;, this is often what they mean.</p> +<p>Not neutral, has a very specific aesthetic, intentional and dramatic hue shifting. +Bright greens and reds turn orange. Bright blues turn magenta. Significantly increased contrast. Brights desaturate across the spectrum.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/tm_aces.png" alt="aces" /></p> +<h3 id="agx">AgX +<a class="anchor-link" href="#agx">#</a> +</h3> +<p>Very neutral. Image is somewhat desaturated when compared to other transforms. Little to no hue shifting. Subtle <a href="https://en.wikipedia.org/wiki/Abney_effect">Abney shifting</a>. <a href="https://github.com/sobotka/AgX">Created by Troy Sobotka</a></p> +<p><img src="https://bevyengine.org/news/bevy-0-10/tm_agx.png" alt="agx" /></p> +<h3 id="somewhat-boring-display-transform">Somewhat Boring Display Transform +<a class="anchor-link" href="#somewhat-boring-display-transform">#</a> +</h3> +<p>Has little hue shifting in the darks and mids, but lots in the brights. Brights desaturate across the spectrum. +Is sort of between Reinhard and Reinhard Luminance. Conceptually similar to reinhard-jodie. +Designed as a compromise if you want e.g. decent skin tones in low light, but can't afford to re-do your +VFX to look good without hue shifting. Created by Tomasz Stachowiak.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/tm_sbdt.png" alt="SomewhatBoringDisplayTransform" /></p> +<h3 id="tonymcmapface">TonyMcMapface +<a class="anchor-link" href="#tonymcmapface">#</a> +</h3> +<p>Very neutral. Subtle but intentional hue shifting. Brights desaturate across the spectrum.</p> +<p>From the author: Tony is a display transform intended for real-time applications such as games. +It is intentionally boring, does not increase contrast or saturation, and stays close to the +input stimulus where compression isn't necessary. +Brightness-equivalent luminance of the input stimulus is compressed. The non-linearity resembles Reinhard. +Color hues are preserved during compression, except for a deliberate <a href="https://en.wikipedia.org/wiki/Bezold%E2%80%93Br%C3%BCcke_shift">Bezold–Brücke shift</a>. +To avoid posterization, selective desaturation is employed, with care to avoid the <a href="https://en.wikipedia.org/wiki/Abney_effect">Abney effect</a>. <a href="https://github.com/h3r2tic/tony-mc-mapface">Created by Tomasz Stachowiak</a></p> +<p><img src="https://bevyengine.org/news/bevy-0-10/tm_tonymcmapface.png" alt="TonyMcMapface" /></p> +<h3 id="blender-filmic">Blender Filmic +<a class="anchor-link" href="#blender-filmic">#</a> +</h3> +<p>Default Filmic Display Transform from Blender. Somewhat neutral. Hues shift. Brights desaturate across the spectrum.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/tm_blender_filmic.png" alt="Blender Filmic" /></p> +<h2 id="color-grading-control">Color Grading Control +<a class="anchor-link" href="#color-grading-control">#</a> +</h2> +<div class="release-feature-authors">authors: @DGriffin91</div> +<p>We've added some basic control over color grading parameters such as exposure, gamma, &quot;pre-tonemapping saturation&quot;, and &quot;post-tonemapping saturation&quot;. These can be configured per camera using the new <a href="https://docs.rs/bevy/0.10.0/bevy/render/view/struct.ColorGrading.html"><code>ColorGrading</code></a> component.</p> +<h3 id="0-5-exposure">0.5 Exposure +<a class="anchor-link" href="#0-5-exposure">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-10/exposure_005.png" alt="0.5 exposure" /></p> +<h3 id="2-25-exposure">2.25 Exposure +<a class="anchor-link" href="#2-25-exposure">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-10/exposure_225.png" alt="2.25 exposure" /></p> +<h2 id="parallel-pipelined-rendering">Parallel Pipelined Rendering +<a class="anchor-link" href="#parallel-pipelined-rendering">#</a> +</h2> +<div class="release-feature-authors">authors: @hymm, @james7132</div> +<p><img src="https://bevyengine.org/news/bevy-0-10/pipelined-rendering-trace.png" alt="Trace with Pipelined Rendering" /></p> +<p>On multithreaded platforms, <strong>Bevy 0.10</strong> will now run significantly faster by running simulation and +rendering in parallel. The renderer was rearchitected in <a href="https://bevyengine.org/news/bevy-0-6/#pipelined-rendering-extract-prepare-queue-render">Bevy 0.6</a> +to enable this, but the final step of actually running them in parallel was not done until now. +There was a bit of tricky work to figure out. The render world has a system that has to run on +the main thread, but the task pool only had the ability to run on the world's thread. So, when we send +the render world to another thread we need to accommodate still running render systems on the main +thread. To accomplish this, we added the ability to spawn tasks onto the main thread in addition to the world's thread.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/pipelined-rendering-histogram.png" alt="Histogram of Many Foxes Frame Time" /></p> +<p>In testing different Bevy examples, the gains were typically in the 10% to 30% range. +As seen in the above histogram, the mean frame time of the &quot;many foxes&quot; stress test +is 1.8ms faster than before.</p> +<p>To use pipelined rendering, you just need to add the <a href="https://docs.rs/bevy/0.10.0/bevy/render/pipelined_rendering/struct.PipelinedRenderingPlugin.html"><code>PipelinedRenderingPlugin</code></a>. If you're +using <a href="https://docs.rs/bevy/0.10.0/bevy/struct.DefaultPlugins.html"><code>DefaultPlugins</code></a> then it will automatically be added for you on all platforms except +wasm. Bevy does not currently support multithreading on wasm which is needed for this +feature to work. If you are not using <a href="https://docs.rs/bevy/0.10.0/bevy/struct.DefaultPlugins.html"><code>DefaultPlugins</code></a> you can add the plugin manually.</p> +<h2 id="windows-as-entities">Windows as Entities +<a class="anchor-link" href="#windows-as-entities">#</a> +</h2> +<div class="release-feature-authors">authors: @aceeri, @Weibye, @cart</div> +<p>In previous versions of Bevy, <a href="https://docs.rs/bevy/0.10.0/bevy/window/struct.Window.html"><code>Window</code></a> was represented as an ECS resource (contained in the <code>Windows</code> resource). In <strong>Bevy 0.10</strong> <a href="https://docs.rs/bevy/0.10.0/bevy/window/struct.Window.html"><code>Window</code></a> is now a component (and therefore windows are represented as entities).</p> +<p>This accomplishes a number of goals:</p> +<ul> +<li>It opens the doors to representing Windows in Bevy's scene system</li> +<li>It exposes <code>Windows</code> to Bevy's powerful ECS queries</li> +<li>It provides granular per-window change detection</li> +<li>Improves the readability/discoverability of creating, using, and closing windows</li> +<li>Changing the properties of a window is the same for both initializing and modifying. No more <code>WindowDescriptor</code> fuss!</li> +<li>It allows Bevy developers and users to easily attach new component data to windows</li> +</ul> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">create_window</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Window <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + title<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>My window :D<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">modify_windows</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">windows</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Window<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> window <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> windows <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + window<span class="z-punctuation z-accessor z-dot z-rust">.</span>title <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>My changed window! :D<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">close_windows</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, <span class="z-variable z-parameter z-rust">windows</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Entity, <span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Window<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> entity <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>windows <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">despawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="renderer-optimizations">Renderer Optimizations +<a class="anchor-link" href="#renderer-optimizations">#</a> +</h2> +<div class="release-feature-authors">authors: @danchia, Rob Swain (@superdump), james7132, @kurtkuehnert, @robfm</div> +<p>Bevy's renderer was ripe for optimization. So we optimized it!</p> +<p>The biggest bottleneck when rendering anything in Bevy is the final render stage, where we collect all of the data in the render world to issue draw calls to the GPU. The core loops here are extremely hot and any extra overhead is noticeable. In <strong>Bevy 0.10</strong>, we've thrown the kitchen sink at this problem and have attacked it from every angle. Overall, these following optimizations should make the render stage <strong>2-3 times faster</strong> than it was in 0.9:</p> +<ul> +<li>In <a href="https://github.com/bevyengine/bevy/pull/7639">#7639</a> by @danchia, we found that even disabled logging has a strong impact on hot loops, netting us 20-50% speedups in the stage.</li> +<li>In <a href="https://github.com/bevyengine/bevy/pull/6944">#6944</a> by @james7132, we shrank the core data structures involved in the stage, reducing memory fetches and netting us 9% speedups.</li> +<li>In <a href="https://github.com/bevyengine/bevy/pull/6885">#6885</a> by @james7132, we rearchitected our <code>PhaseItem</code> and <code>RenderCommand</code> infrastructure to combine common operations when fetching component data from the <code>World</code>, netting us a 7% speedup.</li> +<li>In <a href="https://github.com/bevyengine/bevy/pull/7053">#7053</a> by @james7132, we changed <code>TrackedRenderPass</code>'s allocation patterns to minimize branching within these loops, netting a 6% speedup.</li> +<li>In <a href="https://github.com/bevyengine/bevy/pull/7084">#7084</a> by @james7132, we altered how we're fetching resources from the World to minimize the use of atomics in the stage, netting a 2% speedup.</li> +<li>In <a href="https://github.com/bevyengine/bevy/pull/6988">#6988</a> by @kurtkuehnert, we changed our internal resource IDs to use atomically incremented counters instead of UUIDs, reducing the comparison cost of some of the branches in the stage.</li> +</ul> +<p>One other ongoing development is enabling the render stage to properly parallelize command encoding across multiple threads. Following <a href="https://github.com/bevyengine/bevy/pull/7248">#7248</a> by @james7132, we now support ingesting externally created <code>CommandBuffer</code>s into the render graph, which should allow users to encode GPU commands in parallel and import them into the render graph. This is currently blocked by wgpu, which locks the GPU device when encoding render passes, but we should be able to support parallel command encoding as soon as that's addressed.</p> +<p>On a similar note, we've made steps to enable higher parallelism in other stages of the rendering pipeline. <code>PipelineCache</code> has been a resource that almost every Queue stage system needed to access mutably, but also only rarely needed to be written to. In <a href="https://github.com/bevyengine/bevy/pull/7205">#7205</a>, @danchia changed this to use internal mutability to allow for these systems to parallelize. This doesn't fully allow every system in this stage to parallelize just yet, as there still remain a few common blockers, but it should allow non-conflicting render phases to queue commands at the same time.</p> +<p>Optimization isn't all about CPU time! We've also improved memory usage, compile times, and GPU performance as well!</p> +<ul> +<li>We've also reduced the memory usage of <code>ComputedVisibility</code> by 50% thanks to @james7132. This was done by replacing the internal storage with a set of bitflags instead of multiple booleans.</li> +<li>@robfm also used type erasure as a work-around a <a href="https://github.com/rust-lang/rust/issues/99188">rustc performance regression</a> to ensure that rendering related crates have better compile times, with some of the crates compiling <strong>up to 60% faster</strong>! Full details can be seen in <a href="https://github.com/bevyengine/bevy/pull/5950">#5950</a>.</li> +<li>In <a href="https://github.com/bevyengine/bevy/pull/7069">#7069</a>, Rob Swain (@superdump) reduced the number of active registers used on the GPU to prevent register spilling, significantly improving GPU-side performance.</li> +</ul> +<p>Finally, we have made some improvements on specific usage scenarios:</p> +<ul> +<li>In <a href="https://github.com/bevyengine/bevy/pull/6833">#6833</a>, @james7132 improved the extraction of bones for mesh skinning by 40-50% by omitting an unnecessary buffer copy.</li> +<li>In <a href="https://github.com/bevyengine/bevy/pull/7311">#7311</a>, @james7132 improved UI extraction by 33% by lifting a common computation out of a hot loop.</li> +</ul> +<h2 id="parallelized-transform-propagation-and-animation-kinematics">Parallelized Transform Propagation and Animation Kinematics +<a class="anchor-link" href="#parallelized-transform-propagation-and-animation-kinematics">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132</div> +<p>Transform propagation is one of the core systems of any game engine. If you move a parent entity, you expect its children to move in worldspace. Bevy's transform propagation system happens to be one of the largest bottlenecks for multiple systems: rendering, UI, physics, animation, etc. cannot run until it's complete. It's imperative that transform propagation is fast to avoid blocking all of these systems. In <strong>Bevy 0.9</strong> and before, transform propagation has always been single-threaded and always requires a full hierarchy traversal. As worlds got larger, so did the time spent in this key bottleneck. In <strong>Bevy 0.10</strong>, transform propagation leverages the structure of a well-formed hierarchy to fully run over multiple threads. The full performance benefits entirely depend on how the hierarchy is structured and how many CPU cores are available. In our testing, this has made transform propagation in our <code>many_foxes</code> benchmark <strong>4 times faster</strong> on our testing hardware.</p> +<p>If transform propagation can be parallelized, so can forward kinematics for animation. We leveraged the same guaranteed structure of well formed hierarchies to fully parallelize playing skeletal animations. We also enabled a basic entity-path cache lookup to reduce the extra lookups the system was doing. Altogether, we were able to make the animation player system on the same <code>many_foxes</code> benchmark <strong>10 times faster</strong>.</p> +<p>Combined with all of the other optimizations seen in this release, our tests on the <code>many_foxes</code> benchmark has sped up from ~10ms per frame (~100 FPS) to ~2.3ms per frame (~434 FPS), a near 5x speedup!</p> +<h2 id="ecs-optimizations">ECS Optimizations +<a class="anchor-link" href="#ecs-optimizations">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132, @JoJoJet</div> +<p>ECS underlies the entire engine, so eliminating overhead in the ECS results in engine-wide speedups. In <strong>Bevy 0.10</strong>, we've found quite a few areas where we were able to massively reduce the overhead and improve CPU utilization for the entire engine.</p> +<p>In <a href="https://github.com/bevyengine/bevy/pull/6547">#6547</a>, we enabled <a href="https://en.wikipedia.org/wiki/Automatic_vectorization">autovectorization</a> when using <code>Query::for_each</code>, and its parallel variants. Depending on the target architecture the engine is being compiled for, this can result in a 50-87.5% speed up in query iteration time. In 0.11, we may be extending this optimization to all iterator combinators based on <code>Iterator::fold</code>, such as <code>Iterator::count</code>. See <a href="https://github.com/bevyengine/bevy/pull/6773">this PR</a> for more details.</p> +<p>In <a href="https://github.com/bevyengine/bevy/pull/6681">#6681</a>, by tightly packing entity location metadata and avoiding extra memory lookups, we've significantly reduced the overhead when making random query lookups via <code>Query::get</code>, seeing up to a 43% reduction in the overhead spent in <code>Query::get</code> and <code>World::get</code>.</p> +<p>In <a href="https://github.com/bevyengine/bevy/pull/6800">#6800</a> and <a href="https://github.com/bevyengine/bevy/pull/6902">#6902</a>, we've found that rustc can optimize out compile-time constant branches across function boundaries, moving the branch from runtime to compile time, has resulted in up to a 50% reduction in overhead when using <code>EntityRef::get</code>, <code>EntityMut::insert</code>, <code>EntityMut::remove</code>, and their variants.</p> +<p>In <a href="https://github.com/bevyengine/bevy/pull/6391">#6391</a>, we've reworked <code>CommandQueue</code>'s internals to be more CPU-cache friendly, which has shown up to a 37% speedup when encoding and applying commands.</p> +<h2 id="systemparam-improvements"><code>SystemParam</code> Improvements +<a class="anchor-link" href="#systemparam-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @JoJoJet</div> +<p>Central to Bevy's ECS are <code>SystemParam</code>s: these types, such as <code>Query</code> and <code>Res</code>, dictate what a system can and can't do. +Previously, manually creating one required implementing a family of four inseparable traits. +In <strong>Bevy 0.10</strong>, we've <a href="https://github.com/bevyengine/bevy/pull/6865">used generic associated types</a> to <a href="https://github.com/bevyengine/bevy/pull/6919">reduce this to just two traits</a>: <code>SystemParam</code> and <code>ReadOnlySystemParam</code>.</p> +<p>Additionally, the <code>#[derive(SystemParam)]</code> macro has received a host of miscellaneous usability improvements:</p> +<ul> +<li><strong>More Flexible</strong>: you are no longer forced to declare lifetimes you don't use. Tuple structs are now allowed, and const generics don't break things.</li> +<li><strong>Encapsulated</strong>: a long-standing bug has been fixed that leaked the types of private fields. Now, <code>SystemParam</code>s can properly encapsulate private world data.</li> +<li><strong>Limitless</strong>: the 16-field limit has been lifted, so you can make your params as ridiculously complex as you want. This is most useful for generated code.</li> +</ul> +<h2 id="deferred-world-mutations">Deferred World Mutations +<a class="anchor-link" href="#deferred-world-mutations">#</a> +</h2> +<div class="release-feature-authors">authors: @JoJoJet</div> +<p>You probably know that when you send a <code>Command</code>, it doesn't mutate the world right away. The command gets stored in the system and applied later on +in the schedule. Deferring mutations in this way has a few benefits:</p> +<ul> +<li>Minimizing world accesses: unlike mutable queries (and resources), deferred mutations are free from data access conflicts, which affords greater parallelizability to systems using this pattern.</li> +<li>Order independence: when performing idempotent operations (like setting a global flag), deferred mutations allow you to not worry about system execution order.</li> +<li>Structural mutations: deferred mutations are able to change the structure of the world in ways that <code>Query</code> and <code>ResMut</code> cannot, such as adding components or spawning and despawning entities.</li> +</ul> +<p><strong>Bevy 0.10</strong> adds first-class support for this pattern via the <code>Deferred</code> system parameter, which accepts a <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/system/trait.SystemBuffer.html"><code>SystemBuffer</code></a> trait impl. This lets you create systems with custom deferred mutation behavior while skipping the overhead associated with <code>Commands</code>!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Sends events with a delay, but can run in parallel with other event writers. +</span><span class="z-meta z-struct z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-generic z-rust"><span class="z-entity z-name z-struct z-rust">EventBuffer</span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>E<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span></span><span class="z-meta z-struct z-rust"></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>E<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The `SystemBuffer` trait controls how deferred mutations get applied to the world. +</span><span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span></span><span class="z-meta z-impl z-rust"><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>E<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-impl z-rust"> SystemBuffer <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">EventBuffer</span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>E<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> <span class="z-keyword z-operator z-range z-rust">...</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">my_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">events</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Deferred<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">EventBuffer<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Queue up an event to get sent when commands are applied. +</span> events<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-support z-function z-rust">push</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MyEvent</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Note that this feature should be used with care -- despite the potential performance benefits, inappropriate usage can actually <em>worsen</em> performance. Any time you perform an optimization, make sure you check that it actually speeds things up!</p> +<h2 id="ref-t-queries">Ref&lt;T&gt; Queries +<a class="anchor-link" href="#ref-t-queries">#</a> +</h2> +<div class="release-feature-authors">authors: @Guvante, @JoJoJet</div> +<p>Since Bevy 0.1, <code>Mut&lt;T&gt;</code> has been used to enable change detection (along with related types like <code>ResMut&lt;T&gt;</code>). It's a simple wrapper type that provides mutable access to a component alongside its change tick metadata, automatically marking a change when the value is mutated.</p> +<p>In <strong>Bevy 0.10</strong>, the change detection family has grown with <code>Ref&lt;T&gt;</code>, the immutable variant of <code>Mut&lt;T&gt;</code>. Like its mutable sibling, it allows you to react to changes made outside of the current system.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-other z-rust">use</span> <span class="z-meta z-path z-rust">bevy<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">prelude<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-keyword z-operator z-arithmetic z-rust">*</span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">inspect_changes_system</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>T<span class="z-punctuation z-separator z-rust">:</span> Component <span class="z-keyword z-operator z-rust">+</span> Debug<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">q</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Ref<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>T<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Iterate over each component of type `T` and log its changed status. +</span> <span class="z-keyword z-control z-rust">for</span> val <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>q <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> val<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">is_changed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Value `<span class="z-constant z-other z-placeholder z-rust">{val:?}</span>` was last changed at tick <span class="z-constant z-other z-placeholder z-rust">{}</span>.<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> val<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">last_changed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> <span class="z-keyword z-control z-rust">else</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Value `<span class="z-constant z-other z-placeholder z-rust">{val:?}</span>` is unchanged.<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>We are also deprecating <code>ChangeTrackers&lt;T&gt;</code>, which is the old way of inspecting a component's change ticks. This type will be removed in the next version of Bevy.</p> +<h2 id="cubic-curves">Cubic Curves +<a class="anchor-link" href="#cubic-curves">#</a> +</h2> +<div class="release-feature-authors">authors: @aevyrie</div> +<p><video controls loop><source src="cubic_curves.mp4" type="video/mp4"/></video></p> +<p class="release-feature-authors">This video shows four kinds of cubic curves being smoothly animated with bezier easing. The curve itself is white, green is velocity, red is acceleration, and blue are the control points that determine the shape of the curve.</p> +<p>In preparation for UI animation and hand-tweaked animation curves, cubic curves have been added to <code>bevy_math</code>. The implementation provides multiple curves out of the box, useful in various applications:</p> +<ul> +<li><code>Bezier</code>: user-drawn splines, and cubic-bezier animation easing for UI - helper methods are provided for cubic animation easing as demonstrated in the above video.</li> +<li><code>Hermite</code>: smooth interpolation between two points in time where you know both the position and velocity, such as network prediction.</li> +<li><code>Cardinal</code>: easy interpolation between any number of control points, automatically computing tangents; Catmull-Rom is a type of Cardinal spline.</li> +<li><code>B-Spline</code>: acceleration-continuous motion, particularly useful for camera paths where a smooth change in velocity (acceleration) is important to prevent harsh jerking motion.</li> +</ul> +<p>The <code>CubicGenerator</code> trait is public, allowing you to define your own custom splines that generate <code>CubicCurve</code>s!</p> +<h3 id="performance">Performance +<a class="anchor-link" href="#performance">#</a> +</h3> +<p>The position, velocity, and acceleration of a <code>CubicCurve</code> can be evaluated at any point. These evaluations all have the same performance cost, regardless of the type of cubic curve being used. On a modern CPU, these evaluations take 1-2 ns, and animation easing - which is an iterative process - takes 15-20 ns.</p> +<h2 id="accesskit-integration-into-bevy-ui">AccessKit integration into <code>bevy_ui</code> +<a class="anchor-link" href="#accesskit-integration-into-bevy-ui">#</a> +</h2> +<div class="release-feature-authors">authors: @ndarilek</div> +<p>Games are for everyone: and the way they're built should reflect that. +Accessible games are rare, and proper support is often an afterthought, both at an engine and a game level. +By building our UI solution with accessibility in mind, we hope to fix that.</p> +<p>Bevy has <a href="https://github.com/emilk/egui/pull/2294">joined <code>egui</code></a> in making the first steps towards cross-platform accessibility-by-default, with the help of the outstanding <a href="https://github.com/AccessKit/accesskit">AccessKit</a> crate. +To our knowledge, this makes Bevy the first general purpose game engine with first-party accessibility support.</p> +<p>We've exposed Bevy's UI hierarchy and text elements to screen readers and other assistive devices, managed by the new on-by-default <code>bevy_a11y</code> crate. +This is ultimately powered by the new <a href="https://docs.rs/bevy/0.10.0/bevy/a11y/struct.AccessibilityNode.html"><code>AccessibilityNode</code></a> component, which combines with the existing hierarchy to expose this information directly to AccessKit and the <a href="https://docs.rs/bevy/0.10.0/bevy/a11y/struct.Focus.html"><code>Focus</code></a> resource, which stores the entity that has keyboard focus.</p> +<p>There's still a lot more to be done here: integrating the focus system with a <a href="https://github.com/bevyengine/rfcs/pull/41">gamepad-driven UI controls</a> solution, cleaning up the data model to <a href="https://github.com/bevyengine/bevy/issues/7862">make sure &quot;accessible by default&quot; is a reality</a>), and adding support for remaining features in AccessKit.</p> +<p>Special thanks to <code>@mwcampbell</code>, the lead author of AccessKit, for reviewing our integration and working with us to reduce the number of dependencies upstream, <a href="https://github.com/bevyengine/bevy/pull/6874#issuecomment-1440978453">substantially improving both compile times and final executable size</a>. This is <a href="https://github.com/bevyengine/bevy/pull/6874#issuecomment-1432144117">still a serious challenge on Linux</a>, and so the <code>accesskit_unix</code> feature flag is <a href="https://github.com/bevyengine/bevy/pull/6874#issuecomment-1433896811">disabled by default for now</a>.</p> +<h2 id="spatial-audio">Spatial Audio +<a class="anchor-link" href="#spatial-audio">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf, @DGriffin91, @harudagondi, @alice-i-cecile</div> +<p>The library Bevy uses for audio, <a href="https://crates.io/crates/rodio"><code>rodio</code></a>, contains support for spatial audio. Bevy 0.10 exposes basic spatial audio. There are still a few caveats, like no HRTF and no first class support for <code>Emitter</code> and <code>Listener</code> components.</p> +<p>Interestingly, during the development of this specific feature, <code>@harudagondi</code> found a <a href="https://github.com/RustAudio/rodio/issues/444">bug</a> where the audio channels reverse when running the app in either debug or release mode. This turns out to be a <code>rodio</code> issue, and this also affects previous versions of Bevy. Thanks to <code>@dis-da-moe</code>, the bug has been <a href="https://github.com/RustAudio/rodio/pull/455">fixed upstream</a>. See the linked PR for interesting details about audio programming quirks and performance issues.</p> +<p>You can now have spatial audio in your game! Clone the <code>bevy</code> repository and invoke <code>cargo run --example spatial_audio_3d --release</code> in the command line for a showcase of 3D spatial audio in Bevy.</p> +<h2 id="custom-audio-sources">Custom Audio Sources +<a class="anchor-link" href="#custom-audio-sources">#</a> +</h2> +<div class="release-feature-authors">authors: @dis-da-moe</div> +<p>Bevy supports custom audio sources through the <a href="https://docs.rs/bevy_audio/latest/bevy_audio/trait.Decodable.html"><code>Decodable</code></a> trait, but the way to register to the bevy app is very boilerplatey and sparsely documented. In <strong>Bevy 0.10</strong>, a new extension trait for <code>App</code> is added and the documentation for <a href="https://docs.rs/bevy_audio/latest/bevy_audio/trait.Decodable.html"><code>Decodable</code></a> has vastly improved.</p> +<p>As such, instead of doing this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyCustomAudioSource</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> ... <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">add_asset<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyCustomAudioSource<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">init_resource<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Audio<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyCustomAudioSource<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">init_resource<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">AudioOutput<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyCustomAudioSource<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">play_queued_audio_system<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyCustomAudioSource<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_base_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">CoreSet<span class="z-punctuation z-accessor z-rust">::</span></span>PostUpdate</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>You only have to do this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">add_audio_source<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyCustomAudioSource<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Much cleaner!</p> +<h2 id="shaderdef-values">ShaderDef Values +<a class="anchor-link" href="#shaderdef-values">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>Bevy's shader processor now supports ShaderDefs with values, using the new <a href="https://docs.rs/bevy/0.10.0/bevy/render/render_resource/enum.ShaderDefVal.html"><code>ShaderDefVal</code></a>. This allows developers to pass constant values into their shaders:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> shader_defs <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> + <span class="z-meta z-path z-rust">ShaderDefVal<span class="z-punctuation z-accessor z-rust">::</span></span>Int<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>MAX_DIRECTIONAL_LIGHTS<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +<span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>These can be used in <code>#if</code> statements to selectively enable shader code based on the value:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-operator z-rust">#</span><span class="z-keyword z-control z-rust">if</span> <span class="z-constant z-other z-rust">MAX_DIRECTIONAL_LIGHTS</span> <span class="z-keyword z-operator z-comparison z-rust">&gt;=</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span> +<span class="z-storage z-type z-rust">let</span> color <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-operator z-rust">#</span><span class="z-keyword z-control z-rust">else</span> +<span class="z-storage z-type z-rust">let</span> color <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-operator z-rust">#</span>endif +</span></code></pre> +<p>ShaderDef values can be inlined into shaders:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>var i<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">u32</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> 0u<span class="z-punctuation z-terminator z-rust">;</span> i <span class="z-keyword z-operator z-comparison z-rust">&lt;</span> <span class="z-keyword z-operator z-rust">#</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span><span class="z-constant z-other z-rust">MAX_DIRECTIONAL_LIGHTS</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> i <span class="z-keyword z-operator z-assignment z-rust">=</span> i <span class="z-keyword z-operator z-arithmetic z-rust">+</span> 1u</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>They can also be defined inline in shaders:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-operator z-rust">#</span>define <span class="z-constant z-other z-rust">MAX_DIRECTIONAL_LIGHTS</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span> +</span></code></pre> +<p>ShaderDefs defined in shaders override values passed in from Bevy.</p> +<h2 id="else-ifdef-chains-in-shaders"><code>#else ifdef</code> Chains in Shaders +<a class="anchor-link" href="#else-ifdef-chains-in-shaders">#</a> +</h2> +<div class="release-feature-authors">authors: @torsteingrindvik</div> +<p>Bevy's shader processor now also supports <code>#else ifdef</code> chains like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-operator z-rust">#</span>ifdef <span class="z-constant z-other z-rust">FOO</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> foo code +</span><span class="z-keyword z-operator z-rust">#</span><span class="z-keyword z-control z-rust">else</span> ifdef <span class="z-constant z-other z-rust">BAR</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> bar code +</span><span class="z-keyword z-operator z-rust">#</span><span class="z-keyword z-control z-rust">else</span> ifdef <span class="z-constant z-other z-rust">BAZ</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> baz code +</span><span class="z-keyword z-operator z-rust">#</span><span class="z-keyword z-control z-rust">else</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> fallback code +</span><span class="z-keyword z-operator z-rust">#</span>endif +</span></code></pre> +<h2 id="new-shader-imports-global-and-view">New Shader Imports: Global and View +<a class="anchor-link" href="#new-shader-imports-global-and-view">#</a> +</h2> +<div class="release-feature-authors">authors: @torsteingrindvik</div> +<p>The <code>Global</code> and <code>View</code> structs are now importable in shaders using <code>#import bevy_render::globals</code> and <code>#import bevy_render::view</code>. Bevy's internal shaders now use these imports (saving a lot of redundancy). Previously you either needed to re-define in each shader or import the larger <code>bevy_pbr::mesh_view_types</code> (which wasn't always what was needed).</p> +<p>Previously this was needed:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">View</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">view_proj</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">mat4x4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">inverse_view_proj</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">mat4x4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">view</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">mat4x4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">inverse_view</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">mat4x4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">projection</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">mat4x4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">inverse_projection</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">mat4x4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">world_position</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">vec3<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> viewport(x_origin, y_origin, width, height) +</span> <span class="z-variable z-other z-member z-rust">viewport</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Now you can just do this!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-operator z-rust">#</span>import <span class="z-meta z-path z-rust">bevy_render<span class="z-punctuation z-accessor z-rust">::</span></span>view +</span></code></pre> +<h2 id="adaptive-batching-for-parallel-query-iteration">Adaptive Batching for Parallel Query Iteration +<a class="anchor-link" href="#adaptive-batching-for-parallel-query-iteration">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132</div> +<p><code>Query::par_for_each</code> has been the tool everyone reaches for when their queries get too big to run single-threaded. Got 100,000 entities running around on your screen? No problem, <code>Query::par_for_each</code> chunks it up into smaller batches and distributes the workload over multiple threads. However, in <strong>Bevy 0.9</strong> and before, <code>Query::par_for_each</code> required callers to provide a batch size to help tune these batches for maximum performance. This rather opaque knob often resulted in users just randomly picking a value and rolling with it, or fine tuning the value based on their development machines. Unfortunately, the most effective value is dependent on the runtime environment (i.e. how many logical cores does a player's computer have) and the state of the ECS World (i.e. how many entities are matched?). Ultimately most users of the API just chose a flat number and lived with the results, good or bad.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> 0.9 +</span><span class="z-storage z-type z-rust">const</span> <span class="z-constant z-other z-rust">QUERY_BATCH_SIZE</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">usize</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">32</span><span class="z-punctuation z-terminator z-rust">;</span> + +query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">par_for_each</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-other z-rust">QUERY_BATCH_SIZE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">component</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> ... +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>In 0.10, you no longer need to provide a batch size! If you use <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/system/struct.Query.html#method.par_iter"><code>Query::par_iter</code></a>, Bevy will automatically evaluate the state of the World and task pools and select a batch size <a href="https://github.com/bevyengine/bevy/blob/43ea6f239deefd7a497da6ef581a05a63a278605/crates/bevy_ecs/src/query/par_iter.rs#L24">using a heuristic</a> to ensure sufficient parallelism, without incurring too much overhead. This makes parallel queries as easy to use as normal single-threaded queries! While great for most typical use cases, these heuristics may not be suitable for every workload, so we've provided an escape hatch for those who need finer control over the workload distribution. In the future, we may further tune the backing heuristics to try to get the default to be closer to optimal in these workloads.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> 0.10 +</span>query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">par_iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">for_each</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">component</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> ... +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Fairly easy to convert from a single-threaded for_each. Just change iter to par_iter! +</span>query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">for_each</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">component</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> ... +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>You can also use <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/query/struct.BatchingStrategy.html"><code>BatchingStrategy</code></a> for more control over batching:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">query + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">par_iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> run with batches of 100 +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">batching_strategy</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">BatchingStrategy<span class="z-punctuation z-accessor z-rust">::</span></span>fixed<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">100</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">for_each</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">component</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> ... <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>See the <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/query/struct.BatchingStrategy.html"><code>BatchingStrategy</code></a> docs for more info.</p> +<h2 id="unsafeworldcell-and-unsafeentitycell"><code>UnsafeWorldCell</code> and <code>UnsafeEntityCell</code> +<a class="anchor-link" href="#unsafeworldcell-and-unsafeentitycell">#</a> +</h2> +<div class="release-feature-authors">authors: @jakobhellermann, @BoxyUwU and @JoJoJet</div> +<p><code>UnsafeWorldCell</code> and <code>UnsafeEntityCell</code> allow shared mutable access to parts of the world via unsafe code. It serves a similar purpose as <code>UnsafeCell</code>, allowing people to build interior mutability abstractions such as <code>Cell</code> <code>Mutex</code> <code>Channel</code> etc. In bevy <code>UnsafeWorldCell</code> will be used to support the scheduler and system param implementations as these are interior mutability abstractions for <code>World</code>, it also currently is used to implement <code>WorldCell</code>. We're planning to use <code>UnsafeEntityCell</code> to implement versions of <code>EntityRef</code>/<code>EntityMut</code> that only have access to the components on the entity rather than the entire world.</p> +<p>These abstractions were introduced in <a href="https://github.com/bevyengine/bevy/pull/6404">#6404</a>, <a href="https://github.com/bevyengine/bevy/pull/7381">#7381</a> and <a href="https://github.com/bevyengine/bevy/pull/7568">#7568</a>.</p> +<h2 id="cylinder-shape">Cylinder Shape +<a class="anchor-link" href="#cylinder-shape">#</a> +</h2> +<div class="release-feature-authors">authors: @JayPavlina, @rparrett, @davidhof</div> +<p>The cylinder shape primitive has joined our zoo of built-in shapes!</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/primitive_shapes.png" alt="primitive shapes" /></p> +<h2 id="subdividable-plane-shape">Subdividable Plane Shape +<a class="anchor-link" href="#subdividable-plane-shape">#</a> +</h2> +<div class="release-feature-authors">authors: @woodroww</div> +<p>Bevy's <a href="https://docs.rs/bevy/0.10.0/bevy/prelude/shape/struct.Plane.html"><code>Plane</code></a> shape can now be subdivided any number of times.</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/plane.png" alt="plane" /></p> +<h2 id="camera-output-modes">Camera Output Modes +<a class="anchor-link" href="#camera-output-modes">#</a> +</h2> +<div class="release-feature-authors">authors: @cart, @robtfm</div> +<p>The <a href="/news/bevy-0-8/#camera-driven-rendering">camera-driven</a> post-processing features <a href="/news/bevy-0-9/#hdr-post-processing-tonemapping-and-bloom">added in Bevy 0.9</a> add intuitive control over post-processing across multiple cameras in a scene, but there <a href="https://github.com/bevyengine/bevy/pull/7490">were a few corner cases</a> that didn't <em>quite</em> fit into the hard-coded camera output model. And there were some bugs and limitations related to double-buffered target texture sources of truth being incorrect across cameras and MSAA's sampled texture not containing what it should under some circumstances.</p> +<p><strong>Bevy 0.10</strong> adds a <a href="https://docs.rs/bevy/0.10.0/bevy/render/camera/enum.CameraOutputMode.html"><code>CameraOutputMode</code></a> field to <a href="https://docs.rs/bevy/0.10.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a>, which gives Bevy app developers the ability to manually configure exactly how (and if) a <a href="https://docs.rs/bevy/0.10.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a>'s render results should be written to the final output texture:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Configure the camera to write to the final output texture +</span>camera<span class="z-punctuation z-accessor z-dot z-rust">.</span>output_mode <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">CameraOutputMode<span class="z-punctuation z-accessor z-rust">::</span></span>Write <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Do not blend with the current state of the output texture +</span> blend_state<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">None</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Clear the output texture +</span> color_attachment_load_op<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">LoadOp<span class="z-punctuation z-accessor z-rust">::</span></span>Clear<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Configure the camera to skip writing to the final output texture +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This can save a pass when there are multiple cameras, and can be useful for +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> some post-processing situations +</span>camera<span class="z-punctuation z-accessor z-dot z-rust">.</span>output_mode <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">CameraOutputMode<span class="z-punctuation z-accessor z-rust">::</span></span>Skip<span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><em>Most</em> single-camera and multi-camera setups will not need to touch this setting at all. But if you need it, it will be waiting for you!</p> +<p>MSAA requires an extra intermediate &quot;multisampled&quot; texture, which gets resolved to the &quot;actual&quot; unsampled texture. In some corner case multi-camera setups that render to the same texture, this can create weird / inconsistent results based on whether or not MSAA is enabled or disabled. We've added a new <code>Camera::msaa_writeback</code> <code>bool</code> field which (when enabled) will write the current state of the unsampled texture to the intermediate MSAA texture (if a previous camera has already rendered to the target on a given frame). This ensures that the state is consistent regardless of MSAA configuration. This defaults to true, so you only need to think about this if you have a multi-camera setup and you <em>don't</em> want MSAA writeback.</p> +<h2 id="configurable-visibility-component">Configurable Visibility Component +<a class="anchor-link" href="#configurable-visibility-component">#</a> +</h2> +<div class="release-feature-authors">authors: @ickk</div> +<p>The <a href="https://docs.rs/bevy/0.10.0/bevy/render/view/enum.Visibility.html"><code>Visibility</code></a> component controls whether or not an <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/entity/index.html"><code>Entity</code></a> should be rendered. <strong>Bevy 0.10</strong> reworked the type definition: rather than having a single <code>is_visible: bool</code> field, we now use an enum with an additional mode:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-enum z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">Visibility</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + Hidden<span class="z-punctuation z-separator z-rust">,</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> unconditionally hidden +</span> Visible<span class="z-punctuation z-separator z-rust">,</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> unconditionally visible +</span> Inherited<span class="z-punctuation z-separator z-rust">,</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> inherit visibility from parent +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Much easier to understand! In previous Bevy versions, &quot;inherited visibility&quot; and &quot;hidden&quot; were essentially the only two options. Now entities can opt to be visible, even if their parent is hidden!</p> +<h2 id="asbindgroup-storage-buffers"><code>AsBindGroup</code> Storage Buffers +<a class="anchor-link" href="#asbindgroup-storage-buffers">#</a> +</h2> +<div class="release-feature-authors">authors: @IceSentry, @AndrewB330</div> +<p><a href="https://docs.rs/bevy/0.10.0/bevy/render/render_resource/trait.AsBindGroup.html"><code>AsBindGroup</code></a> is a useful Bevy trait that <a href="/news/bevy-0-8/#new-material-system">makes it very easy to pass data into shaders</a>.</p> +<p><strong>Bevy 0.10</strong> expands this with support for &quot;storage buffer bindings&quot;, which are very useful when passing in large / unbounded chunks of data:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">AsBindGroup</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">CoolMaterial</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">uniform</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">0</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-variable z-other z-member z-rust">color</span><span class="z-punctuation z-separator z-type z-rust">:</span> Color, + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">texture</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">1</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">sampler</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">2</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-variable z-other z-member z-rust">color_texture</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Image<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">storage</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">3</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-variable z-other z-member z-rust">values</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">storage</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">4<span class="z-punctuation z-separator z-rust">,</span> read_only<span class="z-punctuation z-separator z-rust">,</span> buffer</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-variable z-other z-member z-rust">buffer</span><span class="z-punctuation z-separator z-type z-rust">:</span> Buffer, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="extractcomponent-derive"><code>ExtractComponent</code> Derive +<a class="anchor-link" href="#extractcomponent-derive">#</a> +</h2> +<div class="release-feature-authors">authors: @torsteingrindvik</div> +<p>To pass component data from the &quot;main app&quot; to the &quot;render app&quot; for <a href="https://bevyengine.org/news/bevy-0-10/#parallel-pipelined-rendering">pipelined rendering</a>, we run an &quot;extract step&quot;. The <a href="https://docs.rs/bevy/0.10.0/bevy/render/extract_component/trait.ExtractComponent.html"><code>ExtractComponent</code></a> trait is used to copy data over. In previous versions of Bevy, you had to implement it manually, but now you can derive it!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> ExtractComponent</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Car</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-modifier z-rust">pub</span> <span class="z-variable z-other z-member z-rust">wheels</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">usize</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>This expands to this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">ExtractComponent <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">Car</span> +</span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-type z-rust">type</span> <span class="z-entity z-name z-type z-rust">Query</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;static</span> <span class="z-storage z-type z-rust">Self</span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-storage z-type z-type z-rust">type</span> <span class="z-entity z-name z-type z-rust">Filter</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-storage z-type z-type z-rust">type</span> <span class="z-entity z-name z-type z-rust">Out</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-storage z-type z-rust">Self</span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">extract_component</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">item</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">QueryItem<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>&#39;<span class="z-keyword z-operator z-rust">_</span>, <span class="z-meta z-path z-rust"><span class="z-storage z-type z-rust"><span class="z-storage z-type z-rust">Self</span><span class="z-punctuation z-accessor z-rust">::</span></span></span>Query<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Option</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-path z-rust"><span class="z-storage z-type z-rust"><span class="z-storage z-type z-rust">Self</span><span class="z-punctuation z-accessor z-rust">::</span></span></span>Out<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>item<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>It also supports filters!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> ExtractComponent</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">extract_component_filter</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">With&lt;Fuel&gt;</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Car</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-modifier z-rust">pub</span> <span class="z-variable z-other z-member z-rust">wheels</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">usize</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="upgraded-wgpu-to-0-15">Upgraded wgpu to 0.15 +<a class="anchor-link" href="#upgraded-wgpu-to-0-15">#</a> +</h2> +<div class="release-feature-authors">authors: @Elabajaba</div> +<p><strong>Bevy 0.10</strong> now uses the latest and greatest <a href="https://github.com/gfx-rs/wgpu"><code>wgpu</code></a> (our choice of low level graphics layer). In addition to <a href="https://github.com/gfx-rs/wgpu/releases/tag/v0.15.0">a number of nice API improvements and bug fixes</a>, <code>wgpu</code> now uses the DXC shader compiler for DX12, which is faster, less buggy, and allows for new features.</p> +<h2 id="enabled-opengl-backend-by-default">Enabled OpenGL Backend by Default +<a class="anchor-link" href="#enabled-opengl-backend-by-default">#</a> +</h2> +<div class="release-feature-authors">authors: @wangling12</div> +<p>Bevy has supported <code>wgpu</code>'s OpenGL backend for a while now, but it was opt-in. This caused Bevy to fail to start up on some machines that don't support modern apis like Vulkan. In <strong>Bevy 0.10</strong> the OpenGL backend is enabled by default, which means machines will automatically fall back to OpenGL if no other API is available.</p> +<h2 id="exposed-non-uniform-indexing-support-bindless">Exposed Non-Uniform Indexing Support (Bindless) +<a class="anchor-link" href="#exposed-non-uniform-indexing-support-bindless">#</a> +</h2> +<div class="release-feature-authors">authors: @cryscan</div> +<p><strong>Bevy 0.10</strong> wired up initial support for non-uniform indexing of textures and storage buffers. This is an important step toward modern <a href="https://vkguide.dev/docs/gpudriven/gpu_driven_engines/">&quot;bindless / gpu-driven rendering&quot;</a>, which can unlock significant performance on platforms that support it. Note that this is just making the feature available to render plugin developers. Bevy's core rendering features do not (yet) use the bindless approach.</p> +<p>We've added <a href="https://github.com/bevyengine/bevy/blob/v0.10.0/examples/shader/texture_binding_array.rs">a new example</a> illustrating how to use this feature:</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/texture_binding_array.png" alt="texture binding array" /></p> +<h2 id="gamepad-api-improvements">Gamepad API Improvements +<a class="anchor-link" href="#gamepad-api-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @DevinLeamy</div> +<p>The <a href="https://docs.rs/bevy/0.9.0/bevy/input/gamepad/struct.GamepadEventRaw.html"><code>GamepadEventRaw</code></a> type has been removed in favor of separate <a href="https://docs.rs/bevy/0.10.0/bevy/input/gamepad/struct.GamepadConnectionEvent.html"><code>GamepadConnectionEvent</code></a>, <a href="https://docs.rs/bevy/0.10.0/bevy/input/gamepad/struct.GamepadAxisChangedEvent.html"><code>GamepadAxisChangedEvent</code></a>, and <a href="https://docs.rs/bevy/0.10.0/bevy/input/gamepad/struct.GamepadButtonChangedEvent.html"><code>GamepadButtonChangedEvent</code></a>, and the internals have been reworked to accommodate this.</p> +<p>This allows for simpler, more granular event access without filtering down the general <a href="https://docs.rs/bevy/0.10.0/bevy/input/gamepad/enum.GamepadEvent.html"><code>GamepadEvent</code></a> type. Nice!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">events</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">EventReader<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>GamepadConnectionEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> + </span><span class="z-keyword z-control z-rust">for</span> event <span class="z-keyword z-operator z-rust">in</span> events<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +} +</span></code></pre> +<h2 id="input-method-editor-ime-support">Input Method Editor (IME) Support +<a class="anchor-link" href="#input-method-editor-ime-support">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p><a href="https://docs.rs/bevy/0.10.0/bevy/window/struct.Window.html"><code>Window</code></a> can now configure IME support using <code>ime_enabled</code> and <code>ime_position</code>, which enables the use of &quot;dead keys&quot;, which add support for French, Pinyin, etc:</p> +<p><video controls loop><source src="ime.mp4" type="video/mp4"/></video></p> +<h2 id="reflection-paths-enums-and-tuples">Reflection Paths: Enums and Tuples +<a class="anchor-link" href="#reflection-paths-enums-and-tuples">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>Bevy's &quot;reflection paths&quot; enable navigating Rust values using a simple (and dynamic) string syntax. <strong>Bevy 0.10</strong> expands this system by adding support for tuples and enums in reflect paths:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyStruct</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">data</span><span class="z-punctuation z-separator z-type z-rust">:</span> Data, + <span class="z-variable z-other z-member z-rust">some_tuple</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">u32</span>, <span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-section z-group z-end z-rust">)</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">Data</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + Foo<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-type z-rust">u32</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + Bar<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">bool</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-storage z-type z-rust">let</span> x <span class="z-keyword z-operator z-assignment z-rust">=</span> MyStruct <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + data<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Data<span class="z-punctuation z-accessor z-rust">::</span></span>Foo<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">123</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + some_tuple<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">10</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">20</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-arithmetic z-rust">*</span>x<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">path<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>data.1<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">123</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-arithmetic z-rust">*</span>x<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">path<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>some_tuple.0<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="pre-parsed-reflection-paths">Pre-Parsed Reflection Paths +<a class="anchor-link" href="#pre-parsed-reflection-paths">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV, @james7132 </div> +<p>Reflection paths enable a lot of interesting and dynamic editor scenarios, but they do have a downside: calling <code>path()</code> requires parsing strings every time. To solve this problem we added <a href="https://docs.rs/bevy/0.10.0/bevy/reflect/struct.ParsedPath.html"><code>ParsedPath</code></a>, which enables pre-parsing paths and then reusing those results on each access:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> parsed_path <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">ParsedPath<span class="z-punctuation z-accessor z-rust">::</span></span>parse<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>foo.bar[0]<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> element <span class="z-keyword z-operator z-assignment z-rust">=</span> parsed_path<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">element<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">usize</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>some_value</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Much more suitable for repeated access, such as doing the same lookup every frame!</p> +<h2 id="reflectfromreflect"><code>ReflectFromReflect</code> +<a class="anchor-link" href="#reflectfromreflect">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>When using Bevy's Rust reflection system, we sometimes end up in a scenario where we have a &quot;dynamic reflect value&quot; representing a certain type <code>MyType</code> (even though under the hood, it isn't really that type). Such scenarios happen when we call <code>Reflect::clone_value</code>, use the reflection deserializers, or create the dynamic value ourselves. Unfortunately, we can't just call <code>MyType::from_reflect</code> as we do not have knowledge of the concrete <code>MyType</code> at runtime.</p> +<p><a href="https://docs.rs/bevy/0.10.0/bevy/reflect/struct.ReflectFromReflect.html"><code>ReflectFromReflect</code></a> is a new &quot;type data&quot; struct in the <a href="https://docs.rs/bevy/0.10.0/bevy/reflect/struct.TypeRegistry.html"><code>TypeRegistry</code></a> that enables <code>FromReflect</code> trait operations without any concrete references to a given type. Very cool!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect<span class="z-punctuation z-separator z-rust">,</span> FromReflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">reflect</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">FromReflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> &lt;- Register `ReflectFromReflect` +</span><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyStruct</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>String</span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-storage z-type z-rust">let</span> type_id <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">TypeId<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">of<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyStruct<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Register our type +</span><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> registry <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">TypeRegistry<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +registry<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">register<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyStruct<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Create a concrete instance +</span><span class="z-storage z-type z-rust">let</span> my_struct <span class="z-keyword z-operator z-assignment z-rust">=</span> MyStruct<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Hello world<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> `Reflect::clone_value` will generate a `DynamicTupleStruct` for tuple struct types +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Note that this is _not_ a MyStruct instance +</span><span class="z-storage z-type z-rust">let</span> dynamic_value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn Reflect<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> my_struct<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone_value</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Get the `ReflectFromReflect` type data from the registry +</span><span class="z-storage z-type z-rust">let</span> rfr<span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>ReflectFromReflect <span class="z-keyword z-operator z-assignment z-rust">=</span> registry + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_type_data<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ReflectFromReflect<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>type_id</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Call `FromReflect::from_reflect` on our Dynamic value +</span><span class="z-storage z-type z-rust">let</span> concrete_value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn Reflect<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> rfr<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">from_reflect</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>dynamic_value</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>concrete_value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">is<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyStruct<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="other-reflection-improvements">Other Reflection Improvements +<a class="anchor-link" href="#other-reflection-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132, @soqb, @cBournhonesque, @SkiFire13</div> +<ul> +<li><a href="https://docs.rs/bevy/0.10.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> is now implemented for <a href="https://doc.rust-lang.org/std/collections/vec_deque/struct.VecDeque.html"><code>std::collections::VecDeque</code></a></li> +<li>Reflected <a href="https://docs.rs/bevy/0.10.0/bevy/reflect/trait.List.html"><code>List</code></a> types now have <code>insert</code> and <code>remove</code> operations</li> +<li>Reflected <a href="https://docs.rs/bevy/0.10.0/bevy/reflect/trait.Map.html"><code>Map</code></a> types now have the <code>remove</code> operation</li> +<li>Reflected generic types now automatically implement <a href="https://docs.rs/bevy/0.10.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> if the generics also implement Reflect. No need to add manual <code>T: Reflect</code> bounds!</li> +<li>Component Reflection now uses <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/world/struct.EntityRef.html"><code>EntityRef</code></a> / <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/world/struct.EntityMut.html"><code>EntityMut</code></a> instead of both <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/world/struct.World.html"><code>World</code></a> and <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/entity/index.html"><code>Entity</code></a>, which allows it to be used in more scenarios</li> +<li>The Reflection deserializer now avoids unnecessarily cloning strings in some scenarios!</li> +</ul> +<h2 id="upgraded-taffy-to-0-3">Upgraded Taffy To 0.3 +<a class="anchor-link" href="#upgraded-taffy-to-0-3">#</a> +</h2> +<div class="release-feature-authors">authors: @ickshonpe, @rparret</div> +<p><a href="https://crates.io/crates/taffy">Taffy</a> is the library we use to compute layouts for <code>bevy_ui</code>. Taffy 0.2 significantly improves the performance of nested UIs (our <code>many_buttons</code> example is now 8% faster and more deeply nested UIs should see even bigger gains!). It also brings support for the <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/gap">gap</a> property which makes it easier to creates UI with evenly spaced items. Taffy 0.3 adds some nice API tweaks (and also a grid layout feature, which we have disabled for now as it still needs some integration work).</p> +<h2 id="relative-cursor-position">Relative Cursor Position +<a class="anchor-link" href="#relative-cursor-position">#</a> +</h2> +<div class="release-feature-authors">authors: @Pietrek14</div> +<p>We've added a new <a href="https://docs.rs/bevy/0.10.0/bevy/ui/struct.RelativeCursorPosition.html"><code>RelativeCursorPosition</code></a> UI component, which when added to a UI entity tracks the cursor position relative to the node. <code>Some((0, 0))</code> represents the top-left corner of the node, <code>Some((1,1))</code> represents the bottom-right corner of the node, and <code>None</code> represents the cursor being &quot;outside of the node&quot;.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-path z-rust">NodeBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">RelativeCursorPosition<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="const-bevy-ui-defaults">Const Bevy UI Defaults +<a class="anchor-link" href="#const-bevy-ui-defaults">#</a> +</h2> +<div class="release-feature-authors">authors: @james-j-obrien</div> +<p>Bevy uses the <a href="https://doc.rust-lang.org/std/default/trait.Default.html"><code>Default</code></a> trait a lot to make it easy to construct types. Bevy UI types generally implement <a href="https://doc.rust-lang.org/std/default/trait.Default.html"><code>Default</code></a>. However, it has one downside (which is fundamental to Rust): <a href="https://doc.rust-lang.org/std/default/trait.Default.html"><code>Default</code></a> cannot be used in <code>const</code> contexts (<a href="https://blog.rust-lang.org/inside-rust/2022/07/27/keyword-generics.html">yet!</a>). To enable UI layout config to be defined as constants, we've added <code>DEFAULT</code> associated constants to most of the Bevy UI types. For example, you can use <code>Style::DEFAULT</code> to define a const style:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">const</span> <span class="z-constant z-other z-rust">COOL_STYLE</span><span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-keyword z-operator z-assignment z-rust">=</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Size<span class="z-punctuation z-accessor z-rust">::</span></span>width<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">200.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + border<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">UiRect<span class="z-punctuation z-accessor z-rust">::</span></span>all<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-meta z-path z-rust">Style<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">DEFAULT</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="iterating-through-a-world-s-entities">Iterating through a World's Entities +<a class="anchor-link" href="#iterating-through-a-world-s-entities">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132</div> +<p>In <strong>Bevy 0.9</strong>, <code>World::iter_entities</code> allows users to get an iterator over all of the entities in the <code>World</code> in <code>Entity</code> form. In <strong>Bevy 0.10</strong>, this has been changed to be an iterator over <code>EntityRef</code>, which gives full read-only access to all of the entity's components instead of just getting its ID. Its new implementation should also be significantly faster than fetching the <code>EntityRef</code> by hand (though note that a <code>Query</code> will still be faster if you know the exact components you're looking for). This gives users free rein to arbitrarily read any entity data from the World, and may see use in scripting language integrations and reflection-heavy workflows.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Bevy 0.9 +</span><span class="z-keyword z-control z-rust">for</span> entity <span class="z-keyword z-operator z-rust">in</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_entities</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity_ref</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>component</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> entity_ref<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyComponent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-operator z-range z-rust">...</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Bevy 0.10 +</span><span class="z-keyword z-control z-rust">for</span> entity_ref <span class="z-keyword z-operator z-rust">in</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_entities</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>component</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> entity_ref<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyComponent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-operator z-range z-rust">...</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>In the future, we may have a <code>World::iter_entities_mut</code> that exposes this functionality, but gives arbitrary mutable access to all entities in the <code>World</code>. We avoided implementing this for now due to the potential safety concerns of returning an iterator of <code>EntityMut</code>. For more details, see this <a href="https://github.com/bevyengine/bevy/issues/5504">GitHub issue</a>.</p> +<h2 id="lch-color-space">LCH Color Space +<a class="anchor-link" href="#lch-color-space">#</a> +</h2> +<div class="release-feature-authors">authors: @ldubos</div> +<p>Bevy's <a href="https://docs.rs/bevy/0.10.0/bevy/render/color/enum.Color.html"><code>Color</code></a> type now supports the LCH color space (Lightness, Chroma, Hue). LCH has a lot of arguments for it, including that it provides access to about 50% more colors over sRGB. Check out <a href="https://lea.verou.me/2020/04/lch-colors-in-css-what-why-and-how/">this article</a> for more information.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>Lcha <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + lightness<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + chroma<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span><span class="z-punctuation z-separator z-rust">,</span> + hue<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">200.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + alpha<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<h2 id="optimized-color-hex-performance">Optimized <code>Color::hex</code> Performance +<a class="anchor-link" href="#optimized-color-hex-performance">#</a> +</h2> +<div class="release-feature-authors">authors: @wyhaya</div> +<p><a href="https://docs.rs/bevy/0.10.0/bevy/render/color/enum.Color.html#method.hex"><code>Color::hex</code></a> is now a <code>const</code> function, which brought the runtime of <code>hex</code> from ~14ns to ~4ns!</p> +<h2 id="split-up-coreplugin">Split Up <code>CorePlugin</code> +<a class="anchor-link" href="#split-up-coreplugin">#</a> +</h2> +<div class="release-feature-authors">authors: @targrub</div> +<p><code>CorePlugin</code> has historically been a bit of a &quot;kitchen sink plugin&quot;. &quot;Core&quot; things that didn't fit anywhere else ended up there. This isn't a great organizational strategy, so we broke it up into individual pieces: <a href="https://docs.rs/bevy/0.10.0/bevy/core/struct.TaskPoolPlugin.html"><code>TaskPoolPlugin</code></a>, <a href="https://docs.rs/bevy/0.10.0/bevy/core/struct.TypeRegistrationPlugin.html"><code>TypeRegistrationPlugin</code></a>, and <a href="https://docs.rs/bevy/0.10.0/bevy/core/struct.FrameCountPlugin.html"><code>FrameCountPlugin</code></a>.</p> +<h2 id="entitycommands"><code>EntityCommand</code>s +<a class="anchor-link" href="#entitycommands">#</a> +</h2> +<div class="release-feature-authors">authors: @JoJoJet</div> +<p><a href="https://docs.rs/bevy/0.10.0/bevy/ecs/system/struct.Commands.html"><code>Commands</code></a> are &quot;deferred ECS&quot; operations. They enable developers to define custom ECS operations that are applied after a parallel system has finished running. Many <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/system/struct.Commands.html"><code>Commands</code></a> ran on individual entities, but this pattern was a bit cumbersome:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyCustomCommand</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Entity</span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">Command <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">MyCustomCommand</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">write</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">self</span>, <span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something with the entity at self.0 +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-storage z-type z-rust">let</span> id <span class="z-keyword z-operator z-assignment z-rust">=</span> commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SpriteBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">id</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +commmands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MyCustomCommand<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>id</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>To solve this, in <strong>Bevy 0.10</strong> we added the <a href="https://docs.rs/bevy/0.10.0/bevy/ecs/system/trait.EntityCommand.html"><code>EntityCommand</code></a> trait. This allows the command to be ergonomically applied to spawned entities:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyCustomCommand</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">EntityCommand <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">MyCustomCommand</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">write</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">self</span>, <span class="z-variable z-parameter z-rust">id</span><span class="z-punctuation z-separator z-rust">:</span> Entity, <span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something with the given entity id +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SpriteBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MyCustomCommand</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="pixel-perfect-example">Pixel Perfect Example +<a class="anchor-link" href="#pixel-perfect-example">#</a> +</h2> +<div class="release-feature-authors">authors: @Ian-Yy</div> +<p>We now have a new <a href="https://github.com/bevyengine/bevy/blob/v0.10.0/examples/2d/pixel_perfect.rs">&quot;pixel perfect&quot; example</a> that illustrates how to set up pixel-perfect sprites. It uses a cute new Bevy logo sprite!</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/pixel_perfect.png" alt="pixel perfect" /></p> +<h2 id="ui-text-layout-example">UI Text Layout Example +<a class="anchor-link" href="#ui-text-layout-example">#</a> +</h2> +<div class="release-feature-authors">authors: @ickshonpe</div> +<p>We've added a nice <a href="https://github.com/bevyengine/bevy/blob/v0.10.0/examples/ui/text_layout.rs">&quot;text layout&quot; example</a> that illustrates the various Bevy UI text layout settings:</p> +<p><img src="https://bevyengine.org/news/bevy-0-10/text_layout.png" alt="text layout" /></p> +<h2 id="ci-improvements">CI Improvements +<a class="anchor-link" href="#ci-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>We take CI pretty seriously in Bevy land and we're always on the lookout for new ways to make our lives better. We made a number of nice improvements this cycle:</p> +<ul> +<li>We now set an MSRV (minimum supported Rust version) for the <code>bevy</code> crate and we have a CI job that checks the MSRV</li> +<li>CI gives new contributors a friendly welcome message!</li> +<li>CI now asks for a migration guide when a PR is labeled as a breaking change and no migration guide is present</li> +</ul> +<h2 id="the-first-subject-matter-expert-release">The First Subject Matter Expert Release +<a class="anchor-link" href="#the-first-subject-matter-expert-release">#</a> +</h2> +<p>This was our first release using our new <a href="/news/scaling-bevy-development/">Subject Matter Expert (SME) system</a>. We merged an absolutely massive amount of changes, and this was <em>despite</em> our Project Lead <code>@cart</code> being away for about a month for Christmas and snowboarding vacations. We maintained a high quality bar and built amazing things. Suffice it to say the future is looking bright (and sustainable)! Stay tuned for more SME appointments in more areas.</p> +<h2 id="what-s-next"><a name="what-s-next"></a>What's Next? +<a class="anchor-link" href="#what-s-next">#</a> +</h2> +<ul> +<li><strong>Asset System Evolution</strong>: We've made good progress on the <a href="https://github.com/bevyengine/bevy/discussions/3972">next iteration of the Bevy Asset System</a>, which will add the ability to preprocess assets and improve the flexibility and usability of the asset system.</li> +<li><strong>Kicking off the Bevy Editor Effort</strong>: We are ready to start shifting our focus to building out the Bevy Editor! We've started <a href="https://github.com/bevyengine/bevy/discussions/7100">gathering requirements</a> and would like to start the initial design phase in the <strong>Bevy 0.11</strong> cycle.</li> +<li><strong>Temporal Anti-Aliasing (TAA)</strong>: We've largely implemented TAA, which uses motion vectors and time to produce a very popular screen space anti-aliasing effect.</li> +<li><strong>Screen Space Ambient Occlusion (SSAO)</strong>: This is a popular, relatively cheap illumination technique that can make scenes look much more natural. It builds on the Depth Prepass work.</li> +<li><strong>Automated Render Batching and Instancing</strong>: Automatically cut down draw calls by combining geometry or using instancing. This will enable Bevy to render hundreds of thousands of objects without grinding to a halt. We technically already support this, but it must be implemented manually outside of our standard pipeline. This will bring batching and instancing wins &quot;for free&quot; in our built-in render pipeline.</li> +<li><strong>One-shot systems:</strong> Run arbitrary systems in a <a href="https://github.com/bevyengine/bevy/issues/2192">push-based fashion via commands</a>, and store them as callback components for ultra-flexible behavior customization.</li> +<li><strong>Better plugins:</strong> Clearer and more standardized tools for <a href="https://github.com/bevyengine/bevy/issues/2160">adapting third-party plugins to your app's unique architecture</a>, eliminating <a href="https://github.com/bevyengine/bevy/issues/1255">order-dependence in their initialization</a> and defining <a href="https://github.com/bevyengine/bevy/issues/69">dependencies</a> between them.</li> +<li><strong>Pull <code>!Send</code> data out of the <code>World</code>:</strong> storing non thread-safe data in a structure designed to be sent across threads has caused us no end of headaches. We plan on pulling these out into the <code>App</code>, resolving a major blocker for a first-class <a href="https://github.com/bevyengine/rfcs/pull/43">multiple worlds</a> design.</li> +<li><strong>Timestamp window and input events:</strong> As discussed in <a href="https://github.com/bevyengine/bevy/issues/5984">#5984</a>, tracking the exact timing of input events is essential to ensuring that event ordering and timing can be precisely reconstructed.</li> +<li><strong>Opt-out change detection:</strong> improve performance for tiny components by <a href="https://github.com/bevyengine/bevy/issues/4882">turning off change detection at compile or run-time</a>.</li> +<li><strong>Comprehensive Animation Composition:</strong> Supporting non-transitional animation composition (i.e. arbitrary weighted blending of animations). For more complete information, see the <a href="https://github.com/bevyengine/rfcs/pull/51">RFC</a>.</li> +</ul> +<p>Check out the <a href="https://github.com/bevyengine/bevy/milestone/11"><strong>Bevy 0.11 Milestone</strong></a> for an up-to-date list of current work being considered for <strong>Bevy 0.11</strong>.</p> +<h2 id="support-bevy">Support Bevy +<a class="anchor-link" href="#support-bevy">#</a> +</h2> +<p>Sponsorships help make our work on Bevy sustainable. If you believe in Bevy's mission, consider <a href="/community/donate">sponsoring us</a> ... every bit helps!</p> +<p><a class="button button--pink header__cta" href="/community/donate">Donate <img class="button__icon" src="/assets/heart.svg" alt="heart icon"></a></p> +<h2 id="contributors">Contributors +<a class="anchor-link" href="#contributors">#</a> +</h2> +<p>Bevy is made by a <a href="/community/people/">large group of people</a>. A huge thanks to the 173 contributors that made this release (and associated docs) possible! In random order:</p> +<ul> +<li>@killercup</li> +<li>@torsteingrindvik</li> +<li>@utilForever</li> +<li>@garychia</li> +<li>@lewiszlw</li> +<li>@myreprise1</li> +<li>@tomaspecl</li> +<li>@jinleili</li> +<li>@nicopap</li> +<li>@edgarssilva</li> +<li>@aevyrie</li> +<li>@laundmo</li> +<li>@AxiomaticSemantics</li> +<li>@polygon</li> +<li>@SkiFire13</li> +<li>@SludgePhD</li> +<li>@abnormalbrain</li> +<li>@Testare</li> +<li>@ldubos</li> +<li>@SpeedRoll</li> +<li>@rodolphito</li> +<li>@hymm</li> +<li>@rdbo</li> +<li>@AndrewB330</li> +<li>@13ros27</li> +<li>@lupan</li> +<li>@iwek7</li> +<li>@ErickMVdO</li> +<li>@kerkmann</li> +<li>@davidhof</li> +<li>@Pietrek14</li> +<li>@Guvante</li> +<li>@lidong63</li> +<li>@Tirthnp</li> +<li>@x-52</li> +<li>@Suficio</li> +<li>@pascualex</li> +<li>@xgbwei</li> +<li>@BoxyUwU</li> +<li>@superdump</li> +<li>@TheRawMeatball</li> +<li>@wackbyte</li> +<li>@StarLederer</li> +<li>@MrGunflame</li> +<li>@akimakinai</li> +<li>@doup</li> +<li>@komadori</li> +<li>@darthdeus</li> +<li>@phuocthanhdo</li> +<li>@DanielJin21</li> +<li>@LiamGallagher737</li> +<li>@oliviacrain</li> +<li>@IceSentry</li> +<li>@Vrixyz</li> +<li>@johanhelsing</li> +<li>@Dessix</li> +<li>@woodroww</li> +<li>@SDesya74</li> +<li>@alphastrata</li> +<li>@wyhaya</li> +<li>@foxzool</li> +<li>@DasLixou</li> +<li>@nakedible</li> +<li>@soqb</li> +<li>@Dorumin</li> +<li>@maniwani</li> +<li>@Elabajaba</li> +<li>@geieredgar</li> +<li>@stephenmartindale</li> +<li>@TimJentzsch</li> +<li>@holyfight6</li> +<li>@targrub</li> +<li>@smessmer</li> +<li>@redwarp</li> +<li>@LoopyAshy</li> +<li>@mareq</li> +<li>@bjrnt</li> +<li>@slyedoc</li> +<li>@kurtkuehnert</li> +<li>@Charles Bournhonesque</li> +<li>@cryscan</li> +<li>@A-Walrus</li> +<li>@JMS55</li> +<li>@cBournhonesque</li> +<li>@SpecificProtagonist</li> +<li>@Shatur</li> +<li>@VitalyAnkh</li> +<li>@aktaboot</li> +<li>@dis-da-moe</li> +<li>@chrisjuchem</li> +<li>@wilk10</li> +<li>@2ne1ugly</li> +<li>@zeroacez</li> +<li>@jabuwu</li> +<li>@Aceeri</li> +<li>@coreh</li> +<li>@SuperSodaSea</li> +<li>@DGriffin91</li> +<li>@DanielHZhang</li> +<li>@mnmaita</li> +<li>@elbertronnie</li> +<li>@Zeenobit</li> +<li>@oCaioOliveira</li> +<li>@Sjael</li> +<li>@JonahPlusPlus</li> +<li>@devmitch</li> +<li>@alice-i-cecile</li> +<li>@remiCzn</li> +<li>@Sasy00</li> +<li>@sQu1rr</li> +<li>@Ptipiak</li> +<li>@zardini123</li> +<li>@alradish</li> +<li>@adam-shih</li> +<li>@LinusKall</li> +<li>@jakobhellermann</li> +<li>@Andrii Borziak</li> +<li>@figsoda</li> +<li>@james7132</li> +<li>@l1npengtul</li> +<li>@danchia</li> +<li>@AjaxGb</li> +<li>@VVishion</li> +<li>@CatThingy</li> +<li>@zxygentoo</li> +<li>@nfagerlund</li> +<li>@silvestrpredko</li> +<li>@ameknite</li> +<li>@shuoli84</li> +<li>@CrystaLamb</li> +<li>@Nanox19435</li> +<li>@james-j-obrien</li> +<li>@mockersf</li> +<li>@R2Boyo25</li> +<li>@NeoRaider</li> +<li>@MrGVSV</li> +<li>@GuillaumeGomez</li> +<li>@wangling12</li> +<li>@AndrewJakubowicz</li> +<li>@rick68</li> +<li>@RedMachete</li> +<li>@tbillington</li> +<li>@ndarilek</li> +<li>@Ian-Yy</li> +<li>@Edwox</li> +<li>@DevinLeamy</li> +<li>@TehPers</li> +<li>@cart</li> +<li>@mvlabat</li> +<li>@NiklasEi</li> +<li>@ItsDoot</li> +<li>@JayPavlina</li> +<li>@ickk</li> +<li>@Molot2032</li> +<li>@devil-ira</li> +<li>@inodentry</li> +<li>@MinerSebas</li> +<li>@JoJoJet</li> +<li>@Neo-Zhixing</li> +<li>@rparrett</li> +<li>@djeedai</li> +<li>@Pixelstormer</li> +<li>@iiYese</li> +<li>@harudagondi</li> +<li>@1e1001</li> +<li>@ickshonpe</li> +<li>@rezural</li> +<li>@arewerage</li> +<li>@ld000</li> +<li>@imustend</li> +<li>@robtfm</li> +<li>@frewsxcv</li> +</ul> +<h2 id="full-changelog">Full Changelog +<a class="anchor-link" href="#full-changelog">#</a> +</h2> +<h3 id="added">Added +<a class="anchor-link" href="#added">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/6874">Accessibility: Added <code>Label</code> for marking text specifically as a label for UI controls.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6874">Accessibility: Integrate with and expose AccessKit accessibility.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7586">App: <code>App::setup</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7290">App: <code>SubApp::new</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5454">App: Bevy apps will now log system information on startup by default</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6388">Audio Expose symphonia features from rodio in bevy_audio and bevy</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6028">Audio: Basic spatial audio</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6618">ECS: <code>bevy_ptr::dangling_with_align</code>: creates a well-aligned dangling pointer to a type whose alignment is not known at compile time.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6547">ECS: <code>Column::get_added_ticks</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6547">ECS: <code>Column::get_column_ticks</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6853">ECS: <code>DetectChanges::set_if_neq</code>: triggering change detection when the new and previous values are equal. This will work on both components and resources.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6547">ECS: <code>SparseSet::get_added_ticks</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6547">ECS: <code>SparseSet::get_column_ticks</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6547">ECS: <code>Tick</code>, a wrapper around a single change detection tick.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7381">ECS: <code>UnsafeWorldCell::world_mut</code> now exists and can be used to get a <code>&amp;mut World</code> out of <code>UnsafeWorldCell</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7726">ECS: <code>WorldId</code> now implements the <code>FromWorld</code> trait.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6980">ECS: A <code>core::fmt::Pointer</code> impl to <code>Ptr</code>, <code>PtrMut</code> and <code>OwnedPtr</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6587">ECS: Add <code>bevy_ecs::schedule_v3</code> module</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6935">ECS: Add <code>EntityMap::iter()</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7392">ECS: Add <code>Ref</code> to the prelude</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7756">ECS: Add <code>report_sets</code> option to <code>ScheduleBuildSettings</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6592">ECS: add <code>Resources::iter</code> to iterate over all resource IDs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6404">ECS: add <code>UnsafeWorldCell</code> abstraction</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3212">ECS: Add <code>World::clear_resources</code> &amp; <code>World::clear_all</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7017">ECS: Add a basic example for system ordering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7245">ECS: Add a missing impl of <code>ReadOnlySystemParam</code> for <code>Option&lt;NonSend&lt;&gt;&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7415">ECS: add a spawn_on_external method to allow spawning on the scope’s thread or an external thread</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6761">ECS: Add const <code>Entity::PLACEHOLDER</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7793">ECS: Add example to show how to use <code>apply_system_buffers</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6751">ECS: Add logging variants of system piping</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6539">ECS: Add safe constructors for untyped pointers <code>Ptr</code> and <code>PtrMut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7491">ECS: Add unit test with system that panics</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7146">ECS: Add wrapping_add to change_tick</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7466">ECS: Added “base sets” and ported CoreSet to use them.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7009">ECS: Added <code>as_mut</code> and <code>as_ref</code> methods to <code>MutUntyped</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7547">ECS: Added <code>bevy::ecs::system::assert_is_read_only_system</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7284">ECS: Added <code>Components::resource_id</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7186">ECS: Added <code>DebugName</code> world query for more human friendly debug names of entities.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7724">ECS: Added <code>distributive_run_if</code> to <code>IntoSystemConfigs</code> to enable adding a run condition to each system when using <code>add_systems</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6681">ECS: Added <code>EntityLocation::table_id</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6681">ECS: Added <code>EntityLocation::table_row</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7720">ECS: Added <code>IntoIterator</code> implementation for <code>EventReader</code> so you can now do <code>&amp;mut reader</code> instead of <code>reader.iter()</code> for events.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7638">ECS: Added <code>len</code>, <code>is_empty</code>, <code>iter</code> methods on SparseSets.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7471">ECS: Added <code>ManualEventReader::clear()</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7113">ECS: Added <code>MutUntyped::with_type</code> which allows converting into a <code>Mut&lt;T&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7638">ECS: Added <code>new_for_test</code> on <code>ComponentInfo</code> to make test code easy.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7559">ECS: Added <code>not</code> condition.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7866">ECS: Added <code>on_timer</code> and <code>on_fixed_timer</code> run conditions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7039">ECS: Added <code>OwningPtr::read_unaligned</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7547">ECS: Added <code>ReadOnlySystem</code>, which is implemented for any <code>System</code> type whose parameters all implement <code>ReadOnlySystemParam</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7097">ECS: Added <code>Ref</code> which allows inspecting change detection flags in an immutable way</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7009">ECS: Added <code>shrink</code> and <code>as_ref</code> methods to <code>PtrMut</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6900">ECS: Added <code>SystemMeta::name</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7084">ECS: Added <code>SystemState::get_manual_mut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7084">ECS: Added <code>SystemState::get_manual</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7084">ECS: Added <code>SystemState::update_archetypes</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Added a large number of methods on <code>App</code> to work with schedules ergonomically</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7181">ECS: Added conversions from <code>Ptr</code>, <code>PtrMut</code>, and <code>OwningPtr</code> to <code>NonNull&lt;u8&gt;</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7579">ECS: Added rore common run conditions: <code>on_event</code>, resource change detection, <code>state_changed</code>, <code>any_with_component</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7151">ECS: Added support for variants of <code>bevy_ptr</code> types that do not require being correctly aligned for the pointee type.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Added the <code>CoreSchedule</code> enum</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6817">ECS: Added the <code>SystemParam</code> type <code>Deferred&lt;T&gt;</code>, which can be used to defer <code>World</code> mutations. Powered by the new trait <code>SystemBuffer</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7605">ECS: Added the extension methods <code>.and_then(...)</code> and <code>.or_else(...)</code> to run conditions, which allows combining run conditions with short-circuiting behavior.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7863">ECS: Added the marker trait <code>BaseSystemSet</code>, which is distinguished from a <code>FreeSystemSet</code>. These are both subtraits of <code>SystemSet</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7114">ECS: Added the method <code>reborrow</code> to <code>Mut</code>, <code>ResMut</code>, <code>NonSendMut</code>, and <code>MutUntyped</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Added the private <code>prepare_view_uniforms</code> system now has a public system set for scheduling purposes, called <code>ViewSet::PrepareUniforms</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7605">ECS: Added the trait <code>Combine</code>, which can be used with the new <code>CombinatorSystem</code> to create system combinators with custom behavior.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7015">ECS: Added the trait <code>EntityCommand</code>. This is a counterpart of <code>Command</code> for types that execute code for a single entity.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7623">ECS: introduce EntityLocation::INVALID const and adjust Entities::get comment</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7535">ECS: States derive macro</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6957">ECS: support for tuple structs and unit structs to the <code>SystemParam</code> derive macro.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6692">Hierarchy: Add <code>Transform::look_to</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6926">Hierarchy: Added <code>add_child</code>, <code>set_parent</code> and <code>remove_parent</code> to <code>EntityMut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6035">Hierarchy: Added <code>clear_children(&amp;mut self) -&gt; &amp;mut Self</code> and <code>replace_children(&amp;mut self, children: &amp;[Entity]) -&gt; &amp;mut Self</code> function in <code>BuildChildren</code> trait</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6035">Hierarchy: Added <code>ClearChildren</code> and <code>ReplaceChildren</code> struct</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6035">Hierarchy: Added <code>push_and_replace_children_commands</code> and <code>push_and_clear_children_commands</code> test</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7024">Hierarchy: Added the <code>BuildChildrenTransformExt</code> trait</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7325">Input: add Input Method Editor support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5400">Input: Added <code>Axis&lt;T&gt;::devices</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7806">INput: Added common run conditions for <code>bevy_input</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7164">Macro: add helper for macro to get either bevy::x or bevy_x depending on how it was imported</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7653">Math: <code>CubicBezier2d</code>, <code>CubicBezier3d</code>, <code>QuadraticBezier2d</code>, and <code>QuadraticBezier3d</code> types with methods for sampling position, velocity, and acceleration. The generic <code>Bezier</code> type is also available, and generic over any degree of Bezier curve.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7653">Math: <code>CubicBezierEasing</code>, with additional methods to allow for smooth easing animations.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7683">Math: Added a generic cubic curve trait, and implementation for Cardinal splines (including Catmull-Rom), B-Splines, Beziers, and Hermite Splines. 2D cubic curve segments also implement easing functionality for animation.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7321">New reflection path syntax: struct field access by index (example syntax: <code>foo#1</code>)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7782">Reflect <code>State</code> generics other than just <code>RandomState</code> can now be reflected for both <code>hashbrown::HashMap</code> and <code>collections::HashMap</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7396">Reflect: <code>Aabb</code> now implements <code>FromReflect</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7364">Reflect: <code>derive(Reflect)</code> now supports structs and enums that contain generic types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7321">Reflect: <code>ParsedPath</code> for cached reflection paths</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7782">Reflect: <code>std::collections::HashMap</code> can now be reflected</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6831">Reflect: <code>std::collections::VecDeque</code> now implements <code>Reflect</code> and all relevant traits.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7324">Reflect: Add reflection path support for <code>Tuple</code> types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7449">Reflect: Added <code>ArrayIter::new</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6566">Reflect: Added <code>FromReflect::take_from_reflect</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7063">Reflect: Added <code>List::insert</code> and <code>List::remove</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6564">Reflect: Added <code>Map::remove</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6245">Reflect: Added <code>ReflectFromReflect</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7094">Reflect: Added <code>TypeRegistrationDeserializer</code>, which simplifies getting a <code>&amp;TypeRegistration</code> while deserializing a string.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7467">Reflect: Added methods to <code>List</code> that were previously provided by <code>Array</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6560">Reflect: Added support for enums in reflection paths</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7041">Reflect: Added the <code>bevy_reflect_compile_fail_tests</code> crate for testing compilation errors</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7815">Reflect: bevy_reflect: Add missing primitive registrations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6755">Reflect: impl <code>Reflect</code> for <code>&amp;'static Path</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7527">Reflect: implement <code>Reflect</code> for <code>Fxaa</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6633">Reflect: implement <code>TypeUuid</code> for primitives and fix multiple-parameter generics having the same <code>TypeUuid</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6235">Reflect: Implemented <code>Reflect</code> + <code>FromReflect</code> for window events and related types. These types are automatically registered when adding the <code>WindowPlugin</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6786">Reflect: Register Hash for glam types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6811">Reflect: Register missing reflected types for <code>bevy_render</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6973">Render: A pub field <code>extras</code> to <code>GltfNode</code>/<code>GltfMesh</code>/<code>GltfPrimitive</code> which store extras</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6973">Render: A pub field <code>material_extras</code> to <code>GltfPrimitive</code> which store material extras</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7766">Render: Add 'Color::as_lcha' function (#7757)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6557">Render: Add <code>Camera::viewport_to_world_2d</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7060">Render: Add a more familiar hex color entry</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5428">Render: add ambient lighting hook</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7895">Render: Add bevy logo to the lighting example to demo alpha mask shadows</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6672">Render: Add Box::from_corners method</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7481">Render: add OpenGL and DX11 backends</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7796">Render: Add orthographic camera support back to directional shadows</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7847">Render: add standard material depth bias to pipeline</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6781">Render: Add support for Rgb9e5Ufloat textures</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7423">Render: Added buffer usage field to buffers</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7518">Render: can define a value from inside a shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7737">Render: EnvironmentMapLight support for WebGL2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7182">Render: Implement <code>ReadOnlySystemParam</code> for <code>Extract&lt;&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7594">Render: Initial tonemapping options</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6881">Render: ShaderDefVal: add an <code>UInt</code> option</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7701">Render: Support raw buffers in AsBindGroup macro</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7401">Rendering: <code>Aabb</code> now implements <code>Copy</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6699">Rendering: <code>ExtractComponent</code> can specify output type, and outputting is optional.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7292">Rendering: <code>Mssaa::samples</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7431">Rendering: Add <code>#else ifdef</code> to shader preprocessing.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7681">Rendering: Add a field <code>push_constant_ranges</code> to RenderPipelineDescriptor and ComputePipelineDescriptor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6284">Rendering: Added <code>Material::prepass_vertex_shader()</code> and <code>Material::prepass_fragment_shader()</code> to control the prepass from the <code>Material</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6677">Rendering: Added <code>BloomSettings:lf_boost</code>, <code>BloomSettings:lf_boost_curvature</code>, <code>BloomSettings::high_pass_frequency</code> and <code>BloomSettings::composite_mode</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6833">Rendering: Added <code>BufferVec::extend</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6833">Rendering: Added <code>BufferVec::truncate</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7671">Rendering: Added <code>Camera::msaa_writeback</code> which can enable and disable msaa writeback.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7456">Rendering: Added <code>CascadeShadowConfigBuilder</code> to help with creating <code>CascadeShadowConfig</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6284">Rendering: Added <code>DepthPrepass</code> and <code>NormalPrepass</code> component to control which textures will be created by the prepass and available in later passes.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6885">Rendering: Added <code>Draw&lt;T&gt;::prepare</code> optional trait function.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6745">Rendering: Added <code>DrawFunctionsInternals::id()</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7051">Rendering: Added <code>FallbackImageCubemap</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6412">Rendering: Added <code>FogFalloff</code> enum for selecting between three widely used “traditional” fog falloff modes: <code>Linear</code>, <code>Exponential</code> and <code>ExponentialSquared</code>, as well as a more advanced <code>Atmospheric</code> fog;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6720">Rendering: Added <code>get_input_node</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7483">Rendering: Added <code>Lcha</code> member to <code>bevy_render::color::Color</code> enum</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7343">Rendering: Added <code>MainTaret::main_texture_other</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6885">Rendering: Added <code>PhaseItem::entity</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6284">Rendering: Added <code>prepass_enabled</code> flag to the <code>MaterialPlugin</code> that will control if a material uses the prepass or not.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6284">Rendering: Added <code>prepass_enabled</code> flag to the <code>PbrPlugin</code> to control if the StandardMaterial uses the prepass. Currently defaults to false.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6284">Rendering: Added <code>PrepassNode</code> that runs before the main pass</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6284">Rendering: Added <code>PrepassPlugin</code> to extract/prepare/queue the necessary data</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6885">Rendering: Added <code>RenderCommand::ItemorldQuery</code> associated type.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6885">Rendering: Added <code>RenderCommand::ViewWorldQuery</code> associated type.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7248">Rendering: Added <code>RenderContext::add_command_buffer</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7053">Rendering: Added <code>RenderContext::begin_tracked_render_pass</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7248">Rendering: Added <code>RenderContext::finish</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7248">Rendering: Added <code>RenderContext::new</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7671">Rendering: Added <code>SortedCameras</code>, exposing information that was previously internal to the camera driver node.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6720">Rendering: Added <code>try_add_node_edge</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6720">Rendering: Added <code>try_add_slot_edge</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6899">Rendering: Added <code>with_r</code>, <code>with_g</code>, <code>with_b</code>, and <code>with_a</code> to <code>Color</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7684">Rendering: Added 2x and 8x sample counts for MSAA.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6129">Rendering: Added a <code>#[storage(index)]</code> attribute to the derive <code>AsBindGroup</code> macro.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7051">Rendering: Added an <code>EnvironmentMapLight</code> camera component that adds additional ambient light to a scene.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6201">Rendering: Added argument to <code>ScalingMode::WindowSize</code> that specifies the number of pixels that equals one world unit.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6809">Rendering: Added cylinder shape</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6995">Rendering: Added example <code>shaders/texture_binding_array</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6995">Rendering: Added new capabilities for shader validation.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7671">Rendering: Added specializable <code>BlitPipeline</code> and ported the upscaling node to use this.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7546">Rendering: Added subdivisions field to shape::Plane</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6644">Rendering: Added support for additive and multiplicative blend modes in the PBR <code>StandardMaterial</code>, via <code>AlphaMode::Add</code> and <code>AlphaMode::Multiply</code>;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6412">Rendering: Added support for distance-based fog effects for PBR materials, controllable per-camera via the new <code>FogSettings</code> component;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4594">Rendering: Added support for KTX2 <code>R8_SRGB</code>, <code>R8_UNORM</code>, <code>R8G8_SRGB</code>, <code>R8G8_UNORM</code>, <code>R8G8B8_SRGB</code>, <code>R8G8B8_UNORM</code> formats by converting to supported wgpu formats as appropriate</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6644">Rendering: Added support for premultiplied alpha in the PBR <code>StandardMaterial</code>, via <code>AlphaMode::Premultiplied</code>;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7399">Rendering: Added the ability to <code>#[derive(ExtractComponent)]</code> with an optional filter.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7483">Rendering: Added: <code>bevy_render::color::LchRepresentation</code> struct</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7548">Rendering: Clone impl for MaterialPipeline</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6653">Rendering: Implemented <code>Clone</code> for all pipeline types.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6922">Rendering: Smooth Transition between Animations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5346">Support optional env variable <code>BEVY_ASSET_ROOT</code> to explicitly specify root assets directory.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6561">Task: Add thread create/destroy callbacks to TaskPool</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7087">Tasks: Added <code>ThreadExecutor</code> that can only be ticked on one thread.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7790">the extension methods <code>in_schedule(label)</code> and <code>on_startup()</code> for configuring the schedule a system belongs to.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7020">Transform: Added <code>GlobalTransform::reparented_to</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6602">UI: <code>Size::new</code> is now <code>const</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5542">UI: Add const to methods and const defaults to bevy_ui</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7468">UI: Added <code>all</code>, <code>width</code> and <code>height</code> functions to <code>Size</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6807">UI: Added <code>Anchor</code> component to <code>Text2dBundle</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6825">UI: Added <code>CalculatedSize::preserve_aspect_ratio</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6807">UI: Added <code>Component</code> derive to <code>Anchor</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7199">UI: Added <code>RelativeCursorPosition</code>, and an example showcasing it</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7283">UI: Added <code>Text::with_linebreak_behaviour</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7283">UI: Added <code>TextBundle::with_linebreak_behaviour</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7596">UI: Added a <code>BackgroundColor</code> component to <code>TextBundle</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7596">UI: Added a helper method <code>with_background_color</code> to <code>TextBundle</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7859">UI: Added the <code>SpaceEvenly</code> variant to <code>AlignContent</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7859">UI: Added the <code>Start</code> and <code>End</code> variants to <code>AlignItems</code>, <code>AlignSelf</code>, <code>AlignContent</code> and <code>JustifyContent</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6292">UI: Adds <code>flip_x</code> and <code>flip_y</code> fields to <code>ExtractedUiNode</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7718">Utils: Added <code>SyncCell::read</code>, which allows shared access to values that already implement the <code>Sync</code> trait.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7181">Utils: Added the guard type <code>bevy_utils::OnDrop</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6571">Window: Add <code>Windows::get_focused(_mut)</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6612">Window: add span to winit event handler</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7617">Window: Transparent window on macos</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5589">Windowing: <code>WindowDescriptor</code> renamed to <code>Window</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6664">Windowing: Added <code>hittest</code> to <code>WindowAttributes</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7304">Windowing: Added <code>Window::prevent_default_event_handling</code> . This allows bevy apps to not override default browser behavior on hotkeys like F5, F12, Ctrl+R etc.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6527">Windowing: Added <code>WindowDescriptor.always_on_top</code> which configures a window to stay on top.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6664">Windowing: Added an example <code>cargo run --example fallthrough</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6664">Windowing: Added the <code>hittest</code>’s setters/getters</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6664">Windowing: Modifed the <code>WindowDescriptor</code>’s <code>Default</code> impl.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6664">Windowing: Modified the <code>WindowBuilder</code></a></li> +</ul> +<h3 id="changed">Changed +<a class="anchor-link" href="#changed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/6785">Animation: <code>AnimationPlayer</code> that are on a child or descendant of another entity with another player will no longer be run.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6785">Animation: Animation sampling now runs fully multi-threaded using threads from <code>ComputeTaskPool</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6734">App: Adapt path type of dynamically_load_plugin</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7083">App: Break CorePlugin into TaskPoolPlugin, TypeRegistrationPlugin, FrameCountPlugin.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7477">App: Increment FrameCount in CoreStage::Last.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4241">App::run() will now panic when called from Plugin::build()</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6797">Asset: <code>AssetIo::watch_path_for_changes</code> allows watched path and path to reload to differ</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7076">Asset: make HandleUntyped::id private</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6436">Audio: <code>AudioOutput</code> is now a <code>Resource</code>. It's no longer <code>!Send</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7262">Audio: AudioOutput is actually a normal resource now, not a non-send resource</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: <code>.label(SystemLabel)</code> is now referred to as <code>.in_set(SystemSet)</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: <code>App::add_default_labels</code> is now <code>App::add_default_sets</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: <code>App::add_system_set</code> was renamed to <code>App::add_systems</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4878">ECS: <code>Archetype</code> indices and <code>Table</code> rows have been newtyped as <code>ArchetypeRow</code> and <code>TableRow</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6742">ECS: <code>ArchetypeGeneration</code> now implements <code>Ord</code> and <code>PartialOrd</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: <code>bevy_pbr::add_clusters</code> is no longer an exclusive system</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6902">ECS: <code>Bundle::get_components</code> now takes a <code>FnMut(StorageType, OwningPtr)</code>. The provided storage type must be correct for the component being fetched.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7306">ECS: <code>ChangeTrackers&lt;T&gt;</code> has been deprecated. It will be removed in Bevy 0.11.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7014">ECS: <code>Command</code> closures no longer need to implement the marker trait <code>std::marker::Sync</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: <code>CoreStage</code> and <code>StartupStage</code> enums are now <code>CoreSet</code> and <code>StartupSet</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7385">ECS: <code>EntityMut::world_scope</code> now allows returning a value from the immediately-computed closure.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7810">ECS: <code>EntityMut</code>: rename <code>remove_intersection</code> to <code>remove</code> and <code>remove</code> to <code>take</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6851">ECS: <code>EventReader::clear</code> now takes a mutable reference instead of consuming the event reader.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7753">ECS: <code>EventWriter::send_batch</code> will only log a TRACE level log if the batch is non-empty.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5735">ECS: <code>oldest_id</code> and <code>get_event</code> convenience methods added to <code>Events&lt;T&gt;</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7117">ECS: <code>OwningPtr::drop_as</code> will now panic in debug builds if the pointer is not aligned.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7117">ECS: <code>OwningPtr::read</code> will now panic in debug builds if the pointer is not aligned.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7117">ECS: <code>Ptr::deref</code> will now panic in debug builds if the pointer is not aligned.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7117">ECS: <code>PtrMut::deref_mut</code> will now panic in debug builds if the pointer is not aligned.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4777">ECS: <code>Query::par_for_each(_mut)</code> has been changed to <code>Query::par_iter(_mut)</code> and will now automatically try to produce a batch size for callers based on the current <code>World</code> state.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7503">ECS: <code>RemovedComponents</code> now internally uses an <code>Events&lt;RemovedComponentsEntity&gt;</code> instead of an <code>Events&lt;Entity&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: <code>SceneSpawnerSystem</code> now runs under <code>CoreSet::Update</code>, rather than <code>CoreStage::PreUpdate.at_end()</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7574">ECS: <code>StartupSet</code> is now a base set</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: <code>System::default_labels</code> is now <code>System::default_system_sets</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: <code>SystemLabel</code> trait was replaced by <code>SystemSet</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6900">ECS: <code>SystemParamState::apply</code> now takes a <code>&amp;SystemMeta</code> parameter in addition to the provided <code>&amp;mut World</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: <code>SystemTypeIdLabel&lt;T&gt;</code> was replaced by <code>SystemSetType&lt;T&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: <code>tick_global_task_pools_on_main_thread</code> is no longer run as an exclusive system. Instead, it has been replaced by <code>tick_global_task_pools</code>, which uses a <code>NonSend</code> resource to force running on the main thread.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7561">ECS: <code>Tick::is_older_than</code> was renamed to <code>Tick::is_newer_than</code>. This is not a functional change, since that was what was always being calculated, despite the wrong name.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7381">ECS: <code>UnsafeWorldCell::world</code> is now used to get immutable access to the whole world instead of just the metadata which can now be done via <code>UnsafeWorldCell::world_metadata</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7284">ECS: <code>World::init_non_send_resource</code> now returns the generated <code>ComponentId</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7284">ECS: <code>World::init_resource</code> now returns the generated <code>ComponentId</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6843">ECS: <code>World::iter_entities</code> now returns an iterator of <code>EntityRef</code> instead of <code>Entity</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6681">ECS: <code>World</code>s can now only hold a maximum of 2^32 - 1 tables.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6681">ECS: <code>World</code>s can now only hold a maximum of 2^32- 1 archetypes.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7741">ECS: <code>WorldId</code> now implements <code>SystemParam</code> and will return the id of the world the system is running in</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Adding rendering extraction systems now panics rather than silently failing if no subapp with the <code>RenderApp</code> label is found.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7709">ECS: Allow adding systems to multiple sets that share the same base set</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7715">ECS: change <code>is_system_type() -&gt; bool</code> to <code>system_type() -&gt; Option&lt;TypeId&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7381">ECS: changed some <code>UnsafeWorldCell</code> methods to take <code>self</code> instead of <code>&amp;self</code>/<code>&amp;mut self</code> since there is literally no point to them doing that</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6547">ECS: Changed: <code>Query::for_each(_mut)</code>, <code>QueryParIter</code> will now leverage autovectorization to speed up query iteration where possible.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7717">ECS: Default to using ExecutorKind::SingleThreaded on wasm32</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7150">ECS: Ensure <code>Query</code> does not use the wrong <code>World</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7023">ECS: Exclusive systems may now be used with system piping.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7522">ECS: expose <code>ScheduleGraph</code> for use in third party tools</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7727">ECS: extract topsort logic to a new method, one pass to detect cycles and …</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Fixed time steps now use a schedule (<code>CoreSchedule::FixedTimeStep</code>) rather than a run criteria.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7744">ECS: for disconnected, use Vec instead of HashSet to reduce insert overhead</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7125">ECS: Implement <code>SparseSetIndex</code> for <code>WorldId</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7860">ECS: Improve the panic message for schedule build errors</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6867">ECS: Lift the 16-field limit from the <code>SystemParam</code> derive</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7222">ECS: Make <code>EntityRef::new</code> unsafe</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7149">ECS: Make <code>Query</code> fields private</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7723">ECS: make <code>ScheduleGraph::initialize</code> public</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7786">ECS: Make boxed conditions read-only</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7713">ECS: Make RemovedComponents mirror EventReaders API surface</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7166">ECS: Mark TableRow and TableId as repr(transparent)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6547">ECS: Most APIs returning <code>&amp;UnsafeCell&lt;ComponentTicks&gt;</code> now returns <code>TickCells</code> instead, which contains two separate <code>&amp;UnsafeCell&lt;Tick&gt;</code> for either component ticks.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7444">ECS: Move MainThreadExecutor for stageless migration.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7851">ECS: Move safe operations out of <code>unsafe</code> blocks in <code>Query</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7530">ECS: Optimize <code>.nth()</code> and <code>.last()</code> for event iterators</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7582">ECS: Optimize <code>Iterator::count</code> for event iterators</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6683">ECS: Provide public <code>EntityRef::get_change_ticks_by_id</code> that takes <code>ComponentId</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6402">ECS: refactor: move internals from <code>entity_ref</code> to <code>World</code>, add <code>SAFETY</code> comments</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6732">ECS: Rename <code>EntityId</code> to <code>EntityIndex</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7568">ECS: Rename <code>UnsafeWorldCellEntityRef</code> to <code>UnsafeEntityCell</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7519">ECS: Rename schedule v3 to schedule</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7677">ECS: Rename state_equals condition to in_state</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6816">ECS: Replace <code>World::read_change_ticks</code> with <code>World::change_ticks</code> within <code>bevy_ecs</code> crate</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6865">ECS: Replaced the trait <code>ReadOnlySystemParamFetch</code> with <code>ReadOnlySystemParam</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7675">ECS: Simplified the <code>SystemParamFunction</code> and <code>ExclusiveSystemParamFunction</code> traits.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6391">ECS: Speed up <code>CommandQueue</code> by storing commands more densely</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7445">ECS: Stageless: move final apply outside of spawned executor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7463">ECS: Stageless: prettier cycle reporting</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6900">ECS: Systems without <code>Commands</code> and <code>ParallelCommands</code> will no longer show a <code>system_commands</code> span when profiling.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: The <code>ReportHierarchyIssue</code> resource now has a public constructor (<code>new</code>), and implements <code>PartialEq</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: The <code>StartupSchedule</code> label is now defined as part of the <code>CoreSchedules</code> enum</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6694">ECS: The <code>SystemParam</code> derive is now more flexible, allowing you to omit unused lifetime parameters.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: the top level <code>bevy_ecs::schedule</code> module was replaced with <code>bevy_ecs::scheduling</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6921">ECS: Use <code>World</code> helper methods for sending <code>HierarchyEvent</code>s</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7829">ECS: Use a bounded channel in the multithreaded executor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7660">ECS: Use a default implementation for <code>set_if_neq</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7788">ECS: Use consistent names for marker generics</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7841">ECS: Use correct terminology for a <code>NonSend</code> run condition panic</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7870">ECS: Use default-implemented methods for <code>IntoSystemConfig&lt;&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7745">ECS: use try_send to replace send.await, unbounded channel should always b…</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7379">General: The MSRV of the engine is now 1.67.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6558">Input: Bump gilrs version to 0.10</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7493">IOS, Android... same thing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7883">Math: Update <code>glam</code> to <code>0.23</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6607">Math: use <code>Mul&lt;f32&gt;</code> to double the value of <code>Vec3</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7583">Reflect: bevy_reflect now uses a fixed state for its hasher, which means the output of <code>Reflect::reflect_hash</code> is now deterministic across processes.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7206">Reflect: Changed function signatures of <code>ReflectComponent</code> methods, <code>apply</code>, <code>remove</code>, <code>contains</code>, and <code>reflect</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7063">Reflect: Changed the <code>List::push</code> and <code>List::pop</code> to have default implementations.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6578">Reflect: Registered <code>SmallVec&lt;[Entity; 8]&gt;</code> in the type registry</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7321">Renamed methods on <code>GetPath</code>:</a> +<ul> +<li><code>path</code> -&gt; <code>reflect_path</code></li> +<li><code>path_mut</code> -&gt; <code>reflect_path_mut</code></li> +<li><code>get_path</code> -&gt; <code>path</code></li> +<li><code>get_path_mut</code> -&gt; <code>path_mut</code></li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/7537">Render: Allow prepass in webgl</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7069">Render: bevy_pbr: Avoid copying structs and using registers in shaders</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7432">Render: bevy_pbr: Clear fog DynamicUniformBuffer before populating each frame</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7127">Render: bevy_render: Run calculate_bounds in the end-of-update exclusive systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7890">Render: Change the glTF loader to use <code>Camera3dBundle</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7598">Render: Changed &amp;mut PipelineCache to &amp;PipelineCache</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6828">Render: Intepret glTF colors as linear instead of sRGB</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6946">Render: Move 'startup' Resource <code>WgpuSettings</code> into the <code>RenderPlugin</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7354">Render: Move prepass functions to prepass_utils</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7498">Render: Only compute sprite color once per quad</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7798">Render: Only execute <code>#define</code> if current scope is accepting lines</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6503">Render: Pipelined Rendering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7512">Render: Refactor Globals and View structs into separate shaders</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6988">Render: Replace UUID based IDs with a atomic-counted ones</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6878">Render: run clear trackers on render world</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7514">Render: set cull mode: None for Mesh2d</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5900">Render: Shader defs can now have a value</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6305">Render: Shrink ComputedVisibility</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7784">Render: Use prepass shaders for shadows</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6720">Rendering: <code>add_node_edge</code> is now infallible (panics on error)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6720">Rendering: <code>add_slot_edge</code> is now infallible (panics on error)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6937">Rendering: <code>AsBindGroup</code> is now object-safe.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6677">Rendering: <code>BloomSettings::knee</code> renamed to <code>BloomPrefilterSettings::softness</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6677">Rendering: <code>BloomSettings::threshold</code> renamed to <code>BloomPrefilterSettings::threshold</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6940">Rendering: <code>HexColorError::Hex</code> has been renamed to <code>HexColorError::Char</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6720">Rendering: <code>input_node</code> now panics on <code>None</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7696">Rendering: <code>ktx2</code> and <code>zstd</code> are now part of bevy’s default enabled features</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7292">Rendering: <code>Msaa</code> is now enum</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7205">Rendering: <code>PipelineCache</code> no longer requires mutable access in order to queue render / compute pipelines.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7248">Rendering: <code>RenderContext::command_encoder</code> is now private. Use the accessor <code>RenderContext::command_encoder()</code> instead.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7248">Rendering: <code>RenderContext::render_device</code> is now private. Use the accessor <code>RenderContext::render_device()</code> instead.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7248">Rendering: <code>RenderContext</code> now supports adding external <code>CommandBuffer</code>s for inclusion into the render graphs. These buffers can be encoded outside of the render graph (i.e. in a system).</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6201">Rendering: <code>scale</code> is now applied before updating <code>area</code>. Reading from it will take <code>scale</code> into account.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6833">Rendering: <code>SkinnedMeshJoints::build</code> now takes a <code>&amp;mut BufferVec</code> instead of a <code>&amp;mut Vec</code> as a parameter.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7664">Rendering: <code>StandardMaterial</code> now defaults to a dielectric material (0.0 <code>metallic</code>) with 0.5 <code>perceptual_roughness</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7053">Rendering: <code>TrackedRenderPass</code> now requires a <code>&amp;RenderDevice</code> on construction.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6320">Rendering: <code>Visibility</code> is now an enum</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6677">Rendering: Bloom now looks different.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7064">Rendering: Directional lights now use cascaded shadow maps for improved shadow quality.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7548">Rendering: ExtractedMaterials, extract_materials and prepare_materials are now public</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7639">Rendering: For performance reasons, some detailed renderer trace logs now require the use of cargo feature <code>detailed_trace</code> in addition to setting the log level to <code>TRACE</code> in order to be shown.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7671">Rendering: Made cameras with the same target share the same <code>main_texture</code> tracker, which ensures continuity across cameras.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6496">Rendering: Renamed <code>ScalingMode::Auto</code> to <code>ScalingMode::AutoMin</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6201">Rendering: Renamed <code>ScalingMode::None</code> to <code>ScalingMode::Fixed</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6201">Rendering: Renamed <code>window_origin</code> to <code>viewport_origin</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6908">Rendering: Renamed the <code>priority</code> field on <code>Camera</code> to <code>order</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6201">Rendering: Replaced <code>left</code>, <code>right</code>, <code>bottom</code>, and <code>top</code> fields with a single <code>area: Rect</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7051">Rendering: StandardMaterials will now appear brighter and more saturated at high roughness, due to internal material changes. This is more physically correct.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7681">Rendering: The <code>layout</code> field of <code>RenderPipelineDescriptor</code> and <code>ComputePipelineDescriptor</code> is now mandatory.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7016">Rendering: The <code>rangefinder</code> module has been moved into the <code>render_phase</code> module.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6677">Rendering: The bloom example has been renamed to bloom_3d and improved. A bloom_2d example was added.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7046">Rendering: the SubApp Extract stage has been separated from running the sub app schedule.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7043">Rendering: To enable multiple <code>RenderPhases</code> to share the same <code>TrackedRenderPass</code>, the <code>RenderPhase::render</code> signature has changed.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7024">Rendering: update its <code>Transform</code> in order to preserve its <code>GlobalTransform</code> after the parent change</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7356">Rendering: Updated to wgpu 0.15, wgpu-hal 0.15.1, and naga 0.11</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7356">Rendering: Users can now use the DirectX Shader Compiler (DXC) on Windows with DX12 for faster shader compilation and ShaderModel 6.0+ support (requires <code>dxcompiler.dll</code> and <code>dxil.dll</code>)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7013">Rendering: You can now set up the rendering code of a <code>RenderPhase</code> directly using the <code>RenderPhase::render</code> method, instead of implementing it manually in your render graph node.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6663">Scenes: <code>SceneSpawner::spawn_dynamic</code> now returns <code>InstanceId</code> instead of <code>()</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6484">Shape: Change <code>From&lt;Icosphere&gt;</code> to <code>TryFrom&lt;Icosphere&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6696">Tasks: <code>Scope</code> now uses <code>FallibleTask</code> to await the cancellation of all remaining tasks when it’s dropped.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7740">Time: <code>Time::set_relative_speed_fXX</code> now allows a relative speed of -0.0.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7161">UI: <code>FocusPolicy</code> default has changed from <code>FocusPolicy::Block</code> to <code>FocusPolicy::Pass</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7283">UI: <code>TextPipeline::queue_text</code> and <code>GlyphBrush::compute_glyphs</code> now need a TextLineBreakBehaviour argument, in order to pass through the new field.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6825">UI: <code>update_image_calculated_size_system</code> sets <code>preserve_aspect_ratio</code> to true for nodes with images.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7674">UI: Added <code>Changed&lt;Node&gt;</code> to the change detection query of <code>text_system</code>. This ensures that any change in the size of a text node will cause any text it contains to be recomputed.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7626">UI: Changed <code>Size::height</code> so it sets the <code>width</code> to <code>Val::AUTO</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7626">UI: Changed <code>Size::width</code> so it sets the <code>height</code> to <code>Val::AUTO</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6807">UI: Changed <code>TextAlignment</code> into an enum with <code>Left</code>, <code>Center</code>, and <code>Right</code> variants.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6292">UI: Changed extract_uinodes to extract the flip_x and flip_y values from UiImage.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6292">UI: Changed prepare_uinodes to swap the UV coordinates as required.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7859">UI: Changed Taffy version to 0.3.3 and disabled its <code>grid</code> feature.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7475">UI: Changed the <code>Size</code> <code>width</code> and <code>height</code> default values to <code>Val::Auto</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7641">UI: Changed the <code>size</code> field of <code>CalculatedSize</code> to a Vec2.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6292">UI: Changed UiImage derefs to texture field accesses.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6292">UI: Changed UiImage to a struct with texture, flip_x, and flip_y fields.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7283">UI: Modified the <code>text2d</code> example to show both linebreaking behaviours.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6674">UI: Renamed <code>image_node_system</code> to <code>update_image_calculated_size_system</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7452">UI: Renamed the <code>background_color</code> field of <code>ExtractedUiNode</code> to <code>color</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7626">UI: Simplified the UI examples. Replaced numeric values with the Flex property enums or elided them where possible, and removed the remaining use of auto margins.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6825">UI: The <code>MeasureFunc</code> only preserves the aspect ratio when <code>preserve_aspect_ratio</code> is true.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7859">UI: Updated <code>from_style</code> for Taffy 0.3.3.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6743">UI: Upgraded to Taffy 0.2, improving UI layout performance significantly and adding the flexbox <code>gap</code> property and <code>AlignContent::SpaceEvenly</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6807">UI: Use <code>f32::INFINITY</code> instead of <code>f32::MAX</code> to represent unbounded text in Text2dBounds</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7297">Window: expose cursor position with scale</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6582">Window: Make WindowId::primary() const</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7296">Window: revert stage changed for window closing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5589">Windowing: <code>WindowId</code> is now <code>Entity</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7517">Windowing: Moved <code>changed_window</code> and <code>despawn_window</code> systems to <code>CoreStage::Last</code> to avoid systems making changes to the <code>Window</code> between <code>changed_window</code> and the end of the frame as they would be ignored.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5589">Windowing: Requesting maximization/minimization is done on the [<code>Window::state</code>] field.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5589">Windowing: Width/height consolidated into a <code>WindowResolution</code> component.</a></li> +</ul> +<h3 id="removed">Removed +<a class="anchor-link" href="#removed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/7290">App: Removed <code>App::add_sub_app</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7340">App: Rename dynamic feature</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7667">ECS: Remove .on_update method to improve API consistency and clarity</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6727">ECS: Remove <code>BuildWorldChildren</code> impl from <code>WorldChildBuilder</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7800">ECS: Remove a duplicate lookup in <code>apply_state_transitions</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7243">ECS: Remove an incorrect impl of <code>ReadOnlySystemParam</code> for <code>NonSendMut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6801">ECS: Remove APIs deprecated in 0.9</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7469">ECS: Remove broken <code>DoubleEndedIterator</code> impls on event iterators</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7174">ECS: Remove duplicate lookups from <code>Resource</code> initialization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7665">ECS: Remove useless access to archetype in <code>UnsafeWorldCell::fetch_table</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6742">ECS: Removed <code>AddBundle</code>. <code>Edges::get_add_bundle</code> now returns <code>Option&lt;ArchetypeId&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6742">ECS: Removed <code>Archetype::new</code> and <code>Archetype::is_empty</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6742">ECS: Removed <code>ArchetypeComponentId::new</code> and <code>ArchetypeComponentId::value</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6742">ECS: Removed <code>ArchetypeGeneration::value</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6742">ECS: Removed <code>ArchetypeId::new</code> and <code>ArchetypeId::value</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6742">ECS: Removed <code>ArchetypeIdentity</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6742">ECS: Removed <code>Archetypes</code>’s <code>Default</code> implementation.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Removed <code>AsSystemLabel</code> trait</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6740">ECS: Removed <code>Entities::alloc_at_without_replacement</code> and <code>AllocAtWithoutReplacement</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6740">ECS: Removed <code>Entities</code>’s <code>Default</code> implementation.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6740">ECS: Removed <code>EntityMeta</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Removed <code>on_hierarchy_reports_enabled</code> run criteria (now just uses an ad hoc resource checking run condition)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Removed <code>RunCriteriaLabel</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Removed <code>RunCriteriaLabel</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6865">ECS: Removed <code>SystemParamFetch</code>, its functionality has been moved to <code>SystemParamState</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4928">ECS: Removed <code>Table::component_capacity</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Removed <code>transform_propagate_system_set</code>: this was a nonstandard pattern that didn’t actually provide enough control. The systems are already <code>pub</code>: the docs have been updated to ensure that the third-party usage is clear.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7381">ECS: removed <code>UnsafeWorldCell::storages</code> since that is probably unsound since storages contains the actual component/resource data not just metadata</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Removed stages, and all code that mentions stages</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Removed states have been dramatically simplified, and no longer use a stack</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7267">ECS: Removed systems in <code>RenderSet/Stage::Extract</code> no longer warn when they do not read data from the main world</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7040">ECS: Removed the bound <code>T: Sync</code> from <code>Local&lt;T&gt;</code> when used as an <code>ExclusiveSystemParam</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7489">ECS: Removed the method <code>ExclusiveSystemParamState::apply</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6919">ECS: Removed the trait <code>ExclusiveSystemParamState</code>, merging its functionality into <code>ExclusiveSystemParam</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6919">ECS: Removed the trait <code>SystemParamState</code>, merging its functionality into <code>SystemParam</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7001">ECS: Support <code>SystemParam</code> types with const generics</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6800">ECS: Use T::Storage::STORAGE_TYPE to optimize out unused branches</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7145">Hierarchy: Expose transform propagate systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6763">Hierarchy: Make adding children idempotent</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6942">Hierarchy: Remove <code>EntityCommands::add_children</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6965">Input: Gamepad events refactor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6752">Reflect: Make proc macros hygienic in bevy_reflect_derive</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7148">Reflect: Removed <code>#[module]</code> helper attribute for <code>Reflect</code> derives (this is not currently used)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7467">Reflect: Removed <code>Array</code> as supertrait of <code>List</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6820">Reflect: Removed <code>PixelInfo</code> and get <code>pixel_size</code> from wgpu</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6580">Reflect: Removed <code>ReflectSerialize</code> and <code>ReflectDeserialize</code> registrations from most glam types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7472">Remove unnecessary <code>Default</code> impl of HandleType</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6730">Remove warning about missed events due to false positives</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6605">Render: Make Core Pipeline Graph Nodes Public</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7311">Render: Optimize color computation in prepare_uinodes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6936">Render: Organized scene_viewer into plugins for reuse and organization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7526">Render: put <code>update_frusta::&lt;Projection&gt;</code> in <code>UpdateProjectionFrusta</code> set</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7597">Render: Remove dependency on the mesh struct in the pbr function</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7279">Render: remove potential ub in render_resource_wrapper</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7033">Render: Remove redundant bitwise OR <code>TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7891">Render: Remove the early exit to make sure the prepass textures are cleared</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7280">Render: remove the image loaded check for nodes without images in extract_uinodes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6671">Render: Remove unnecessary alternate create_texture path in prepare_asset for Image</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7509">Render: remove unused var in fxaa shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6787">Render: set AVAILABLE_STORAGE_BUFFER_BINDINGS to the actual number of buffers available</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7316">Render: Use <code>Time</code> <code>resource</code> instead of <code>Extract</code>ing <code>Time</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7524">Render: use better set inheritance in render systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7899">Render: use blendstate blend for alphamode::blend</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7884">Render: Use Image::default for 1 pixel white texture directly</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7053">Rendering: Removed <code>bevy_render::render_phase::DrawState</code>. It was not usable in any form outside of <code>bevy_render</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6677">Rendering: Removed <code>BloomSettings::scale</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6885">Rendering: Removed <code>EntityPhaseItem</code> trait</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6833">Rendering: Removed <code>ExtractedJoints</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7875">Rendering: Removed <code>SetShadowViewBindGroup</code>, <code>queue_shadow_view_bind_group()</code>, and <code>LightMeta::shadow_view_bind_group</code> in favor of reusing the prepass view bind group.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6912">Rendering: Removed the <code>render</code> feature group.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6859">Scene: scene viewer: can select a scene from the asset path</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6673">Text: Warn instead of erroring when max_font_atlases is exceeded</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7134">Transform: Removed <code>GlobalTransform::translation_mut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7769">UI: Re-enable taffy send+sync assert</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6796">UI: Remove <code>TextError::ExceedMaxTextAtlases(usize)</code> variant</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6970">UI: Remove needless manual default impl of ButtonBundle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6807">UI: Removed <code>HorizontalAlign</code> and <code>VerticalAlign</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6674">UI: Removed <code>ImageMode</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7414">UI: Removed <code>QueuedText</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6674">UI: Removed the <code>image_mode</code> field from <code>ImageBundle</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7641">UI: Removed the <code>Val</code> &lt;-&gt; <code>f32</code> conversion for <code>CalculatedSize</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7370">Update toml_edit to 0.18</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6709">Update tracing-chrome requirement from 0.6.0 to 0.7.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7277">Window: Remove unnecessary windows.rs file</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7480">Windowing: <code>window.always_on_top</code> has been removed, you can now use <code>window.window_level</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7517">Windowing: Removed <code>ModifiesWindows</code> system label.</a></li> +</ul> +<h3 id="fixed">Fixed +<a class="anchor-link" href="#fixed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/7825">Asset: Fix asset_debug_server hang. There should be at most one ThreadExecut…</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7246">Asset: fix load_internal_binary_asset with debug_asset_server</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6797">Assets: Hot reloading for <code>LoadContext::read_asset_bytes</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6955">Diagnostics: Console log messages now show when the <code>trace_tracy</code> feature was enabled.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7619">ECS: Fix <code>last_changed()</code> and <code>set_last_changed()</code> for <code>MutUntyped</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7105">ECS: Fix a miscompilation with <code>#[derive(SystemParam)]</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6625">ECS: Fix get_unchecked_manual using archetype index instead of table row.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7458">ECS: Fix ignored lifetimes in <code>#[derive(SystemParam)]</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7261">ECS: Fix init_non_send_resource overwriting previous values</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6639">ECS: fix mutable aliases for a very short time if <code>WorldCell</code> is already borrowed</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5214">ECS: Fix partially consumed <code>QueryIter</code> and <code>QueryCombinationIter</code> having invalid <code>size_hint</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6698">ECS: Fix PipeSystem panicking with exclusive systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6534">ECS: Fix soundness bug with <code>World: Send</code>. Dropping a <code>World</code> that contains a <code>!Send</code> resource on the wrong thread will now panic.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6896">ECS: Fix Sparse Change Detection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7688">ECS: Fix trait bounds for run conditions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7805">ECS: Fix unsoundnes in <code>insert</code> <code>remove</code> and <code>despawn</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7387">ECS: Fix unsoundness in <code>EntityMut::world_scope</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7560">ECS: Fixed <code>DetectChanges::last_changed</code> returning the wrong value.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7560">ECS: Fixed <code>DetectChangesMut::set_last_changed</code> not actually updating the <code>changed</code> tick.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5105">ECS: Fixed <code>Res</code> and <code>Query</code> parameter never being mutually exclusive.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7056">ECS: Fixed a bug that caused <code>#[derive(SystemParam)]</code> to leak the types of private fields.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7350">ECS: schedule_v3: fix default set for systems not being applied</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7448">ECS: Stageless: close the finish channel so executor doesn't deadlock</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7446">ECS: Stageless: fix unapplied systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7031">Hierarchy: don't error when sending HierarchyEvents when Event type not registered</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7003">Hierarchy: Fix unsoundness for <code>propagate_recursive</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6926">Hierarchy: Fixed missing <code>ChildAdded</code> events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6847">Input: Avoid triggering change detection for inputs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7233">Input: Fix <code>AxisSettings::new</code> only accepting invalid bounds</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7238">Input: Fix incorrect behavior of <code>just_pressed</code> and <code>just_released</code> in <code>Input&lt;GamepadButton&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6597">Input: Removed Mobile Touch event y-axis flip</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6829">Reflect: bevy_reflect: Fix misplaced impls</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6722">Reflect: Fix bug where deserializing unit structs would fail for non-self-describing formats</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6894">Reflect: Fix bug where scene deserialization using certain readers could fail (e.g. <code>BufReader</code>, <code>File</code>, etc.)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7520">Reflect: fix typo in bevy_reflect::impls::std GetTypeRegistration for vec like…</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7755">Reflect: Retain <code>::</code> after <code>&gt;</code>, <code>)</code> or bracket when shortening type names</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7539">Render: bevy_core_pipeline: Fix prepass sort orders</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7078">Render: Cam scale cluster fix</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7725">Render: fix ambiguities in render schedule</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6802">Render: fix bloom viewport</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7878">Render: Fix dependency of shadow mapping on the optional <code>PrepassPlugin</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7425">Render: Fix feature gating in texture_binding_array example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6658">Render: Fix material alpha_mode in example global_vs_local_translation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7754">Render: fix regex for shader define: must have at least one whitespace</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7305">Render: fix shader_instancing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7176">Render: fix spot dir nan again</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7904">Render: Recreate tonemapping bind group if view uniforms buffer has changed</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7048">Render: Shadow render phase - pass the correct view entity</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7846">Render: Text2d doesn't recompute text on changes to the text's bounds</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6643">Render: wasm: pad globals uniform also in 2d</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7897">Rendering: Emission strength is now correctly interpreted by the <code>StandardMaterial</code> as linear instead of sRGB.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6707">Rendering: Fix deband dithering intensity for non-HDR pipelines.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7051">Rendering: Fixed StandardMaterial occlusion being incorrectly applied to direct lighting.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6914">Rendering: Fixed the alpha channel of the <code>image::DynamicImage::ImageRgb32F</code> to <code>bevy_render::texture::Image</code> conversion in <code>bevy_render::texture::Image::from_dynamic()</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6254">Scene: Cleanup dynamic scene before building</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6524">Task: Fix panicking on another scope</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7478">UI: <code>Size::height</code> sets <code>width</code> not <code>height</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7510">UI: Don't ignore UI scale for text</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7877">UI: Fix <code>bevy_ui</code> compile error without <code>bevy_text</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7142">UI: Fix overflow scaling for images</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7351">UI: fix upsert_leaf not setting a MeasureFunc for new leaf nodes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6934">Window: Apply <code>WindowDescriptor</code> settings in all modes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7298">Window: break feedback loop when moving cursor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7668">Window: create window as soon as possible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7276">Window: Fix a typo on <code>Window::set_minimized</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7628">Window: Fix closing window does not exit app in desktop_app mode</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/7010">Window: fix cursor grab issue</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6599">Window: Fix set_cursor_grab_mode to try an alternative mode before giving an error</a></li> +</ul> + + + + Scaling Bevy Development + 2023-01-14T00:00:00+00:00 + 2023-01-14T00:00:00+00:00 + + https://bevyengine.org/news/scaling-bevy-development/ + <p>The Bevy community has grown a lot over the past couple of years. We've had over 3,642 pull requests, 599 contributors, 357,917 downloads, and 21,200 github stars. Together we've built the most popular, most used Rust game engine on the market and the <a href="https://github.com/topics/game-engine">second most popular game engine on GitHub</a>. Up until now, in the interest of maintaining a consistent vision and quality bar, I've kept our decision making process as small and centralized as possible. And I scaled out our leadership roles as slowly as possible. I believe this was the right call for Bevy's early days, but we are overdue for changes that bias toward more trust and development agility.</p> +<span id="continue-reading"></span><h2 id="the-current-state-of-things">The Current State Of Things +<a class="anchor-link" href="#the-current-state-of-things">#</a> +</h2> +<p>I <em>have</em> been slowly delegating responsibility over time, and each time I placed trust in someone it yielded massive benefits to both the project and my personal well being. We now have 3 more fantastic Maintainers: Alice (@alice-i-cecile), François (@mockersf), and Rob (@superdump). And their scope has grown over time.</p> +<p>But even today, I must personally approve <em>every</em> &quot;controversial&quot; change to Bevy, where &quot;controversial&quot; is basically anything that meaningfully expands our features, user experience, or scope. With the volume of controversial changes we're seeing now, and the number of things I would still like to personally design and build, this is untenable. I have long since reached the limits of my bandwidth and the community has felt those limits for long enough.</p> +<p>When Bevy was younger and the community was newer, this level of conservativeness made sense. I knew what I wanted to build, how the pieces fit together, and what my capabilities were. What I didn't know as well was what everyone else wanted to build, what their capabilities were, and how that all fit into my personal vision.</p> +<p>I can now happily report that the situation has changed. We have proven technical experts in a variety of areas. They regularly design and build huge pieces of Bevy in a way that aligns with our collective vision for the future. Sometimes we have different ideas about what the future should look like, but we almost always reach consensus eventually. They have done outstanding technical work, built trust, and made Bevy amazing. They deserve a seat at the table.</p> +<p>With that preamble out of the way, I am excited to announce two major changes to the Bevy Organization.</p> +<h2 id="a-new-role-subject-matter-expert">A New Role: Subject Matter Expert +<a class="anchor-link" href="#a-new-role-subject-matter-expert">#</a> +</h2> +<p>Subject Matter Experts (SME for short) are Bevy developers that have consistently demonstrated technical expertise and synchronized vision within a given &quot;subject area&quot; (ex: Rendering, ECS, Reflection, Animation). They must have contributed and reviewed significant pieces of Bevy within their area. These people have the ability to vote on controversial pull requests in their subject area (both <a href="https://github.com/bevyengine/bevy">code changes</a> and <a href="https://github.com/bevyengine/rfcs">RFCs</a>). SMEs are also great people to reach out to if you have questions about a given subject area in Bevy.</p> +<p>If two SMEs within a given subject area approve a &quot;controversial&quot; PR, a maintainer can now merge it. We are intentionally keeping the number of SMEs within a subject area small to make establishing consensus and enforcing a consistent vision easier. For now, 2 SMEs is the bare minimum to allow voting to occur, 3 is the &quot;sweet spot&quot;, and 4 will be allowed under some circumstances, but is the &quot;upper limit&quot;.</p> +<p>As Project Lead, I can still merge controversial PRs. Consider 2 SME approvals as equivalent to a Project Lead approval. As a last line of defense for cohesion, the Project Lead maintains final say on changes. While I will by default defer to the SMEs, if they approve a PR that I firmly believe is the wrong direction for Bevy, I will still block or revert the change. Preserving consistent vision and quality is critically important to me. But I intend to bias toward trust and consensus as much as possible.</p> +<p>It is the job of SMEs to strive for consensus amongst themselves, the wider Bevy community, and Project Leads. They can merge controversial changes without me, but they still must do their best to anticipate my reaction to those changes (and discuss the changes with me ahead of time when that feels relevant). Likewise, I will try to establish consensus with SMEs and the wider community before making changes myself.</p> +<p>We are rolling out SMEs slowly so we can tweak the process over time and avoid changing too much too quickly. We've largely started with subject areas that have the most activity and the clearest subject matter experts. Join me in welcoming our initial set of SMEs!</p> +<ul> +<li><strong>Rendering</strong>: @superdump (Rob Swain), @robtfm (Rob Macdonald)</li> +<li><strong>ECS</strong>: @BoxyUwU (Boxy), @james7132 (James Liu), @maniwani (Joy)</li> +<li><strong>Reflection</strong>: @MrGVSV (Gino Valente), @jakobhellermann (Jakob Hellermann)</li> +<li><strong>Animation</strong>: @james7132 (James Liu), @mockersf (François Mockers)</li> +</ul> +<p>Hopefully there aren't too many surprises here. These people have been building fantastic things in their areas for a long time now.</p> +<p>We will be rolling out more subject areas (and the SMEs inside them) as SMEs prove themselves within the Bevy project and express interest. New areas are largely defined by the experts doing work inside them. We expect areas like UI, Editor, and Audio to be populated in reasonably short order.</p> +<p>We have also left spots open in each of the subject areas above. If you believe you meet our SME criteria for any current or proposed subject area and have interest in the role, don't hesitate to reach out to myself or any of the other maintainers. We will consider new candidates regularly. Just because you weren't included in this first batch doesn't mean we don't think you would be a good fit!</p> +<h2 id="a-new-maintainer">A New Maintainer +<a class="anchor-link" href="#a-new-maintainer">#</a> +</h2> +<p>We also want to improve our velocity for merging uncontroversial pull requests. And there will be new maintainership load associated with facilitating the SME process. The current maintainers and I have unanimously agreed that it is time to bring on one more maintainer.</p> +<p>Join me in welcoming James Liu (@james7132) as our latest maintainer! James has proven themselves to be a technical expert across many of Bevy's systems (especially ECS, animation, parallelization / task scheduling, and optimization). You may have noticed that they also have the SME role for ECS and Animation. They have contributed huge volumes of code changes, provided solid reviews, are easy to work with, and have a vision for Bevy's future that aligns with ours.</p> +<h2 id="a-new-bevy-organization-document">A New Bevy Organization Document +<a class="anchor-link" href="#a-new-bevy-organization-document">#</a> +</h2> +<p>We have a new <a href="https://github.com/cart/bevy/blob/sme/docs/the_bevy_organization.md">Bevy Organization Document</a>, which describes how the Bevy Organization will work going forward. It outlines the functionality of each role, as well as the expectations we have for them. The previously existing roles (Project Lead, Maintainer) still work the same way, but their definition and scope have been made much clearer.</p> +<p>The biggest changes to the organization are the new SME role and an initial description of &quot;role rotation&quot;:</p> +<p>Roles like Project Lead, Maintainer, and SME are intentionally kept in limited supply to ensure a cohesive project vision. However these roles can be taxing, sometimes other aspects of life need to take priority, and qualified motivated people deserve a chance to lead. To resolve these issues, we plan on building in &quot;role rotation&quot;. What this looks like hasn't yet been determined (as this issue hasn't come up yet and we are still in the process of scaling out our team), but we will try to appropriately balance the needs and desires of both current and future leaders, while also ensuring consistent vision and continuity for Bevy.</p> +<h2 id="the-bevy-people-page">The Bevy People Page +<a class="anchor-link" href="#the-bevy-people-page">#</a> +</h2> +<p>Bevy is a community-driven project. It makes sense for the people behind Bevy and the roles they fill to be easily discoverable.</p> +<p>To make that happen, François (@mockersf) and I built a new <a href="https://bevyengine.org/community/people/">Bevy People</a> page. &quot;Bevy people&quot; can opt-in to listing their name and/or pseudonym, their social information (GitHub, Discord, Mastodon, Twitter, personal website, itch.io, etc), a sponsorship link, and a personal bio describing who they are and what they work on.</p> +<p>It also displays the current Bevy Organization roles these people occupy. You <em>could</em> call it an &quot;org chart&quot; if you wanted to, but my anti-bureaucracy reflexes prevent me from doing so. The Bevy community will always be as flat and &quot;people first&quot; as possible.</p> +<p>It is open to anyone (both Bevy Organization members and the wider Bevy community). If you would like to see yourself on this page, <a href="https://github.com/bevyengine/bevy-community">create a pull request here</a>.</p> +<p>This is what it looks like! +<img src="https://bevyengine.org/news/scaling-bevy-development/bevy_people.png" alt="bevy people" /></p> +<h2 id="looking-forward">Looking Forward +<a class="anchor-link" href="#looking-forward">#</a> +</h2> +<p>The next Bevy release (Bevy 0.10) is roughly a month away and I'm very excited for the changes we have in the pipeline. I can't guarantee all of these will make it in, but they're all shaping up nicely:</p> +<ul> +<li><strong>The New &quot;Stageless&quot; ECS Scheduler</strong>: We've fully rebuilt our scheduler to be more flexible. We no longer need &quot;stages&quot; to handle &quot;exclusive system scheduling&quot;. Any system of any type can be ordered relative to any other system (even if they have exclusive access to the ECS <code>World</code>. Many scheduling APIs are now cleaner and easier to use. And we've taken the chance to improve related APIs like States as well.</li> +<li><strong>Depth and Normal Prepass</strong>: This will give rendering feature developers access to the depth buffer and normals during the main render phase, which enables a variety of render features and optimizations.</li> +<li><strong>Screen Space Ambient Occlusion</strong>: This is a popular, relatively cheap illumination technique that can make scenes look much more natural. It builds on the Depth Prepass work.</li> +<li><strong>Asset Preprocessing</strong>: We're reworking our asset system to allow for pre processing assets into more efficient forms, which can make deployed games faster to load, prettier, and faster. This is a full asset system rework that improves a good portion of our asset APIs.</li> +<li><strong>Windows as Entities</strong>: Windows are now ECS Entities instead of Resources, which makes them more natural to construct and query, more extensible, and opens the doors to including them in Bevy Scenes.</li> +<li><strong>UI Style Split</strong>: Breaks the monolithic UI style type out into smaller pieces, embracing a less centralized and more extensible pattern.</li> +</ul> +<p>See you in about a month!</p> + + + + Bevy 0.9 + 2022-11-12T00:00:00+00:00 + 2022-11-12T00:00:00+00:00 + + https://bevyengine.org/news/bevy-0-9/ + <p>Thanks to <strong>159</strong> contributors, <strong>430</strong> pull requests, community reviewers, and our <a href="https://github.com/sponsors/cart"><strong>generous sponsors</strong></a>, I'm happy to announce the <strong>Bevy 0.9</strong> release on <a href="https://crates.io/crates/bevy">crates.io</a>!</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out our <a href="/learn/book/getting-started/">Quick Start Guide</a> to try it today. It's free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. Check out <a href="https://bevyengine.org/assets">Bevy Assets</a> for a collection of community-developed plugins, games, and learning resources.</p> +<p>To update an existing Bevy App or Plugin to <strong>Bevy 0.9</strong>, check out our <a href="/learn/migration-guides/0.8-0.9/">0.8 to 0.9 Migration Guide</a>.</p> +<p>Since our last release a few months ago we've added a <em>ton</em> of new features, bug fixes, and quality of life tweaks, but here are some of the highlights:</p> +<span id="continue-reading"></span> +<ul> +<li><strong>HDR Post Processing, Tonemapping, and Bloom</strong>: Bevy has a new HDR post processing and tonemapping pipeline, which we used to implement the &quot;bloom&quot; post processing effect!</li> +<li><strong>FXAA</strong>: Fast approximate anti-aliasing was added, which gives users a new cheap option for screen space anti-aliasing.</li> +<li><strong>Deband Dithering</strong>: Hide gradient precision errors with this new post processing effect!</li> +<li><strong>Other Post Processing Improvements</strong>: View target double buffering and automatic render target format handling.</li> +<li><strong>New Scene Format</strong>: Bevy's new scene format is smaller, simpler to compose manually, and easier to read. Comes in both &quot;human readable&quot; and &quot;binary&quot; variants!</li> +<li><strong>Code Driven Scene Construction</strong>: Build scenes dynamically from an existing app using queries and specific entity references.</li> +<li><strong>Improved Entity/Component APIs</strong>: Spawning entities with components is now simpler and more ergonomic than ever!</li> +<li><strong>Exclusive System Rework</strong>: Exclusive systems (systems with unique ECS World access) are now just &quot;normal&quot; systems with significantly improved usability.</li> +<li><strong>Enum Reflection</strong>: Bevy Reflect can now reflect enum types, which exposes them to Bevy's scene system and opens doors to editor tooling for enums.</li> +<li><strong>Time Shader Globals</strong>: Time is now passed to shaders as a global, making time-driven animation in custom shaders easy!</li> +<li><strong>Plugin Settings</strong>: Plugins can now have settings, which can be overridden in plugin groups, simplifying the plugin configuration story.</li> +<li><strong>Bevy UI Z-Indices</strong>: Control how UI elements stack on top of each other using local and global z-indices</li> +</ul> +<h2 id="hdr-post-processing-tonemapping-and-bloom">HDR Post Processing, Tonemapping, and Bloom +<a class="anchor-link" href="#hdr-post-processing-tonemapping-and-bloom">#</a> +</h2> +<div class="release-feature-authors">authors: @ChangeCaps, @jakobhellermann, @cart, @JMS55</div> +<p>Bevy now supports the &quot;bloom&quot; post processing effect, backed by a ton of internal improvements to our HDR (High Dynamic Range) render pipeline.</p> +<p><img src="https://bevyengine.org/news/bevy-0-9/bloom.png" alt="bloom" /></p> +<p>Bloom creates a &quot;blurred&quot; effect around bright lights, which emulates how cameras (and our eyes) often perceive light in the real world. High quality bloom builds on top of HDR render pipelines, which represents light and color using more than the standard 8 bits per channel (rgba) used elsewhere. In previous releases Bevy already did <a href="/news/bevy-0-5/#physically-based-rendering-pbr">HDR lighting internally in its PBR shader</a>, but because we were rendering to a &quot;normal&quot; (low dynamic range) texture, we had to lose the extra high dynamic range information when we mapped the HDR lighting to the LDR texture (using a process called tonemapping).</p> +<p>In <strong>Bevy 0.9</strong>, you can now configure cameras to render to HDR textures, which will preserve the high dynamic range information after the &quot;main pass&quot; is finished rendering:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">Camera <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Currently this defaults to false, but we will likely +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> switch this to true by default in future releases +</span> hdr<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-language z-rust">true</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>This enables post processing effects, such as bloom, to have access to the raw HDR information. When HDR textures are enabled, we delay &quot;tonemapping&quot; until after &quot;HDR post processing effects&quot; have run in our <a href="/news/bevy-0-6/#render-graphs-and-sub-graphs">Render Graph</a>.</p> +<p>Bloom is enabled by adding a <a href="https://docs.rs/bevy/0.9.0/bevy/core_pipeline/bloom/struct.BloomSettings.html"><code>BloomSettings</code></a> component to a camera with HDR textures enabled:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + Camera3dBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + camera<span class="z-punctuation z-separator z-rust">:</span> Camera <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + hdr<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-language z-rust">true</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">BloomSettings<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>The bloom effect can be overbearing if misconfigured. <a href="https://docs.rs/bevy/0.9.0/bevy/core_pipeline/bloom/struct.BloomSettings.html"><code>BloomSettings</code></a> has a number of options to tune it, but the most relevant is <code>intensity</code>, which can (and should) be used to adjust how much the effect is applied.</p> +<p>Seriously ... this effect can be obnoxious:</p> +<p><img src="https://bevyengine.org/news/bevy-0-9/too_much_bloom.png" alt="too much bloom" /></p> +<p>In most cases, it is best to err on the side of subtlety.</p> +<p>HDR rendering is also available in 2D, which means you can also use bloom effects in 2D!</p> +<p><img src="https://bevyengine.org/news/bevy-0-9/2d_bloom.png" alt="2D bloom" /></p> +<h2 id="fxaa-fast-approximate-anti-aliasing">FXAA: Fast Approximate Anti-Aliasing +<a class="anchor-link" href="#fxaa-fast-approximate-anti-aliasing">#</a> +</h2> +<div class="release-feature-authors">authors: @DGriffin91, @cart</div> +<p><strong>Bevy 0.9</strong> adds support for FXAA (fast approximate anti-aliasing). FXAA is a popular (and cheap!) anti-aliasing approach that uses luminance data contrast to identify edges and blur them:</p> +<p><img src="https://bevyengine.org/news/bevy-0-9/no_aa.png" alt="no_aa" /> +<img src="https://bevyengine.org/news/bevy-0-9/fxaa.png" alt="fxaa" /></p> +<p>Bevy already has support for MSAA (multisample anti-aliasing), which does multiple samples when rendering geometry edges, which makes those edges crisper:</p> +<p><img src="https://bevyengine.org/news/bevy-0-9/msaa.png" alt="msaa" /></p> +<p>Picking an anti-aliasing implementation is all about tradeoffs:</p> +<ul> +<li><strong>MSAA</strong>: Crisp, high quality geometry edges. Leaves other parts of the image (such as textures and shadows) untouched, which can be a pro (crisper outputs) or a con (more aliasing). More expensive than FXAA.</li> +<li><strong>FXAA</strong>: Considers the entire image when blurring, including textures, which can be a pro (textures and shadows get anti-aliased) or a con (the image gets blurrier as a whole). Cheap to run (a good choice for mobile or web AA).</li> +</ul> +<p>Now that our post processing pipeline is maturing, we plan on adding even more anti-aliasing options in future Bevy releases. We already have TAA (temporal anti-aliasing) and SMAA (subpixel morphological anti-aliasing) implementations in the works!</p> +<h2 id="deband-dithering">Deband Dithering +<a class="anchor-link" href="#deband-dithering">#</a> +</h2> +<div class="release-feature-authors">authors: @aevyrie</div> +<p>&quot;Color banding&quot; is a known limitation when using 8 bit color channels (which are required by pretty much every device / screen).</p> +<p>This is most visible when trying to render smooth gradients for low noise textures (ex: the lighting on a &quot;pure green&quot; material):</p> +<p><img src="https://bevyengine.org/news/bevy-0-9/banding.png" alt="banding" /></p> +<p>If you look closely at the green plane <em>or</em> the tan cube, you will notice distinct bands for each shade of color. A popular solution to this problem is to &quot;dither&quot; the final image.</p> +<p><strong>Bevy 0.9</strong> now performs &quot;deband dithering&quot; by default in the tonemapping stage:</p> +<p><img src="https://bevyengine.org/news/bevy-0-9/debanding.png" alt="debanding" /></p> +<p>You can enable and disable this per-camera:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"> commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Camera3dBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + tonemapping<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Tonemapping<span class="z-punctuation z-accessor z-rust">::</span></span>Enabled <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + deband_dither<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-language z-rust">true</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="post-processing-view-target-double-buffering">Post Processing: View Target Double Buffering +<a class="anchor-link" href="#post-processing-view-target-double-buffering">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>Rendering post processing effects requires both an input texture (containing the &quot;current&quot; render) and an output texture (the &quot;new&quot; render with the effect applied). Previous versions of Bevy only had one main &quot;view target&quot; image. This meant that naively, post processing effects would need to manage and render to their own &quot;intermediate&quot; texture, then write it <em>back</em> to the main target. This is clearly inefficient, as we have a new texture allocation for each effect <em>and</em> we have the extra work of copying the intermediate texture back to the main texture.</p> +<p>To solve this, in <strong>Bevy 0.9</strong> we now &quot;double buffer&quot; our view target textures, which means we have two copies of them that we flip between. At a given moment in time, one is the current &quot;main&quot; texture and the other is the &quot;next&quot; main texture. Post processing effect developers can now trigger a &quot;post process write&quot;, which returns a <code>source</code> and <code>destination</code> texture. It assumes that an effect will write <code>source</code> to <code>destination</code> (with or without modifications). <code>destination</code> will then become the new &quot;main&quot; texture.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> post_process <span class="z-keyword z-operator z-assignment z-rust">=</span> view_target<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">post_process_write</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-function z-rust">render_some_effect</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>render_context<span class="z-punctuation z-separator z-rust">,</span> post_process<span class="z-punctuation z-accessor z-dot z-rust">.</span>source<span class="z-punctuation z-separator z-rust">,</span> post_process<span class="z-punctuation z-accessor z-dot z-rust">.</span>destination</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This reduces the complexity burden on post processing effect developers and keeps our pipeline nice and efficient. The new <a href="/news/bevy-0-9/#fxaa-fast-approximate-anti-aliasing">FXAA effect</a> was implemented using this new system. Post processing plugin developers can use that implementation as a reference.</p> +<h2 id="improved-render-target-texture-format-handling">Improved Render Target Texture Format Handling +<a class="anchor-link" href="#improved-render-target-texture-format-handling">#</a> +</h2> +<div class="release-feature-authors">authors: @VitalyAnkh, @cart</div> +<p><strong>Bevy 0.9</strong> now detects and uses each window's / surface's preferred <a href="https://docs.rs/bevy/0.9.0/bevy/render/render_resource/enum.TextureFormat.html"><code>TextureFormat</code></a>, rather than using hard-coded compile-time-selected per-platform formats. This means that we automatically support uncommon platforms and configurations. Additionally, Bevy's main passes and post processing passes now render to stable / consistent <a href="https://docs.rs/bevy/0.9.0/bevy/render/render_resource/enum.TextureFormat.html"><code>TextureFormats</code></a> (ex: <code>Rgba16Float</code> for HDR). We do a final blit from these &quot;standard&quot; textures to the final render target's preferred format. This simplifies render pipeline construction, allows for render pipeline re-use across render targets (even if their formats don't match), and provides consistent and predictable render pipeline behaviors.</p> +<p>This also means that when rendering to a texture, the texture format no longer needs to match the surface's texture format. For example, you can now render to a texture that only has a red channel:</p> +<p><img src="https://bevyengine.org/news/bevy-0-9/render_to_texture_red.png" alt="render to texture red" /></p> +<h2 id="new-scene-format">New Scene Format +<a class="anchor-link" href="#new-scene-format">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p><strong>Bevy 0.9</strong> introduces a <em>much</em> improved scene format, which makes scenes smaller, simpler to compose manually, and easier to read. This is backed by a ton of improvements to Bevy Reflect (Bevy's Rust runtime reflection system). Most of the improvements to the Bevy Scene Format are actually generic improvements to all Bevy Reflect serialization!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The New Bevy Scene Format +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + entities<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-constant z-numeric z-integer z-decimal z-rust">0</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + components<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Player<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + name<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Reyna<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + position<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + x<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + y<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Health<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + current<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">5</span><span class="z-punctuation z-separator z-rust">,</span> + max<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Team<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> A<span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + components<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Player<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + name<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Sova<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + position<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + x<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + y<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Health<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + current<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span><span class="z-punctuation z-separator z-rust">,</span> + max<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Team<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> B<span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Compare that to the old format:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The Old Bevy Scene Format +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + entity<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + components<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> + <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Player<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>struct<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>name<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>alloc::string::String<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Reyna<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>position<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>glam::f32::vec2::Vec2<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>struct<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>x<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>f32<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>y<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>f32<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Health<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>struct<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>current<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>usize<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">5</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>max<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>usize<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Team<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> A<span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + entity<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-separator z-rust">,</span> + components<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> + <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Player<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>struct<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>name<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>alloc::string::String<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Sova<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>position<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>glam::f32::vec2::Vec2<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>struct<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>x<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>f32<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>y<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>f32<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Health<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>struct<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>current<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>usize<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>max<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>usize<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Team<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> B<span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +<span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +</span></code></pre> +<p>There are so many improvements that it might be hard to pick them all out!</p> +<h3 id="simpler-struct-syntax">Simpler Struct Syntax +<a class="anchor-link" href="#simpler-struct-syntax">#</a> +</h3> +<p>Structs now use struct-style formatting instead of complicated map-based representations.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Health<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>struct<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>current<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>usize<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">5</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>max<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>usize<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Health<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + current<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">5</span><span class="z-punctuation z-separator z-rust">,</span> + max<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span></code></pre> +<h3 id="simpler-primitive-serialization">Simpler Primitive Serialization +<a class="anchor-link" href="#simpler-primitive-serialization">#</a> +</h3> +<p>Types can now opt in to direct serde serialization, which makes primitive values much nicer to work with:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>name<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>alloc::string::String<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Reyna<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span>name<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Reyna<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span></code></pre> +<h3 id="nicer-enum-syntax">Nicer Enum Syntax +<a class="anchor-link" href="#nicer-enum-syntax">#</a> +</h3> +<p>Consider the enum:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-enum z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">Team</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + A<span class="z-punctuation z-separator z-rust">,</span> + B<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Lets compare how it is serialized:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Team<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> A<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>game::Team<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> A<span class="z-punctuation z-separator z-rust">,</span> +</span></code></pre> +<p>Also note that Bevy Reflect didn't even directly support enums until <strong>Bevy 0.9</strong>. Older versions of Bevy required using <code>#[reflect_value]</code> in combination with normal serde for enums, which was much more complicated. See the <a href="https://bevyengine.org/news/bevy-0-9/#enum-reflection">Enum Reflection</a> section of this blog post for details!</p> +<h3 id="nicer-tuples">Nicer Tuples +<a class="anchor-link" href="#nicer-tuples">#</a> +</h3> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>(f32, f32)<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>tuple<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> + <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>f32<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>f32<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + <span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>(f32, f32)<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<h3 id="top-level-struct">Top Level Struct +<a class="anchor-link" href="#top-level-struct">#</a> +</h3> +<p>Bevy Scenes now have a top level struct, which allows us to add additional values and metadata to the Bevy Scene format in the future (such as version numbers, ECS Resources, assets, etc).</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> + <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> entities here <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> +<span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + entities<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> entities here <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h3 id="use-maps-where-appropriate">Use Maps Where Appropriate +<a class="anchor-link" href="#use-maps-where-appropriate">#</a> +</h3> +<p>Entity IDs and Component values must be unique in Bevy ECS. To better represent that, we now use map syntax instead of a list.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + entity<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + components<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> <span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + entity<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-separator z-rust">,</span> + components<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> <span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +<span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + entities<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-constant z-numeric z-integer z-decimal z-rust">0</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + components<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + components<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h2 id="binary-scene-formats">Binary Scene Formats +<a class="anchor-link" href="#binary-scene-formats">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>Bevy Scenes can be serialized and deserialized to/from binary formats, such as <a href="https://crates.io/crates/bincode/2.0.0-rc.1"><code>bincode</code></a>, <a href="https://crates.io/crates/postcard"><code>postcard</code></a>, and <a href="https://crates.io/crates/rmp-serde"><code>rmp_serde</code></a>. This required adding support for &quot;non-self-describing&quot; formats to the new scene format.</p> +<p>In the case of postcard, this can be almost 5x smaller (4.53x for the scene above)! Very useful if you are trying to keep the size of the scene small on disk, or send the scene over the network.</p> +<h2 id="dynamic-scene-builder">Dynamic Scene Builder +<a class="anchor-link" href="#dynamic-scene-builder">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>Bevy Scenes can now be constructed dynamically using the new <a href="https://docs.rs/bevy/0.9.0/bevy/scene/struct.DynamicSceneBuilder.html"><code>DynamicSceneBuilder</code></a>. Previous versions of Bevy already supported <a href="https://github.com/bevyengine/bevy/blob/v0.8.1/examples/scene/scene.rs#L78">writing &quot;whole worlds&quot; to scenes</a>, but in some cases, users might only want to write <em>specific</em> entities to a scene. <strong>Bevy 0.9</strong>'s <a href="https://docs.rs/bevy/0.9.0/bevy/scene/struct.DynamicSceneBuilder.html"><code>DynamicSceneBuilder</code></a> makes this possible:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Write players to a scene +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>World, <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Entity, <span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> builder <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">DynamicSceneBuilder<span class="z-punctuation z-accessor z-rust">::</span></span>from_world<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + builder<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">extract_entities</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-storage z-type z-rust">let</span> dynamic_scene <span class="z-keyword z-operator z-assignment z-rust">=</span> builder<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">build</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p><code>extract_entities</code> accepts any <code>Entity</code> iterator.</p> +<p>You can also pass in specific entities:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">builder<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">extract_entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="more-scene-construction-tools">More Scene Construction Tools +<a class="anchor-link" href="#more-scene-construction-tools">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p><a href="https://docs.rs/bevy/0.9.0/bevy/scene/struct.Scene.html"><code>Scenes</code></a> can now be cloned:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> scene <span class="z-keyword z-operator z-assignment z-rust">=</span> scene<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone_with</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>type_registry</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><a href="https://docs.rs/bevy/0.9.0/bevy/scene/struct.DynamicScene.html"><code>DynamicScenes</code></a> can now be converted to <a href="https://docs.rs/bevy/0.9.0/bevy/scene/struct.Scene.html"><code>Scenes</code></a>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> scene <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">Scene<span class="z-punctuation z-accessor z-rust">::</span></span>from_dynamic_scene<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>dynamic_scene<span class="z-punctuation z-separator z-rust">,</span> type_registry</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="improved-entity-component-apis">Improved Entity / Component APIs +<a class="anchor-link" href="#improved-entity-component-apis">#</a> +</h2> +<div class="release-feature-authors">authors: @DJMcNab, @cart</div> +<p>Spawning entities with components and adding / removing them from entities just got even easier!</p> +<p>First some quick fundamentals: Bevy ECS uses <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/component/trait.Component.html"><code>Components</code></a> to add data and logic to entities. To make entity composition easier, Bevy ECS also has <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/bundle/trait.Bundle.html"><code>Bundles</code></a>, which define groups of components to be added together.</p> +<p>Just like in previous versions of Bevy, Bundles can be tuples of components:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Player <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> name<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Sova<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Health<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">10</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Team<span class="z-punctuation z-accessor z-rust">::</span></span>A</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>The <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/bundle/trait.Bundle.html"><code>Bundle</code></a> trait can also be derived:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Bundle</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">PlayerBundle</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">player</span><span class="z-punctuation z-separator z-type z-rust">:</span> Player, + <span class="z-variable z-other z-member z-rust">health</span><span class="z-punctuation z-separator z-type z-rust">:</span> Health, + <span class="z-variable z-other z-member z-rust">team</span><span class="z-punctuation z-separator z-type z-rust">:</span> Team, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>In <strong>Bevy 0.9</strong>, <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/component/trait.Component.html"><code>Component</code></a> types now <em>also</em> automatically implement the <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/bundle/trait.Bundle.html"><code>Bundle</code></a> trait, which allows us to consolidate all entity component operations under new <code>spawn</code>, <code>insert</code>, and <code>remove</code> apis. Previously, we had separate variants for <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/bundle/trait.Bundle.html"><code>Bundle</code></a> (ex: <code>insert_bundle(SomeBundle)</code>) and <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/component/trait.Component.html"><code>Component</code></a> (ex: <code>.insert(SomeComponent)</code>).</p> +<p>The <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/bundle/trait.Bundle.html"><code>Bundle</code></a> trait is now also implemented for tuples of <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/bundle/trait.Bundle.html"><code>Bundles</code></a> instead of just tuples of <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/component/trait.Component.html"><code>Components</code></a>. The value of this will be made clear in a moment.</p> +<p>First, <code>spawn</code> now takes a bundle:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old (variant 1) +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SpriteBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old (variant 2) +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SpriteBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SpriteBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Already we've saved some characters, but we're just getting started! Because <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/component/trait.Component.html"><code>Component</code></a> implements <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/bundle/trait.Bundle.html"><code>Bundle</code></a>, we can now also pass in single components into <code>spawn</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Player <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> name<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Sova<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Player <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> name<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Sova<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Things get even more interesting when we introduce <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/bundle/trait.Bundle.html"><code>Bundle</code></a> tuples into the mix, which allow us to combine many operations (covering both components and bundles) into a single <code>spawn</code> call:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span>commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PlayerBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">TransformBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>ActivePlayer</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-path z-rust">PlayerBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">TransformBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + ActivePlayer<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This is <em>much</em> easier to type and read. And on top of that, from the perspective of Bevy ECS this is a single &quot;bundle spawn&quot; instead of multiple operations, which cuts down on <a href="/news/bevy-0-5/#component-storage-the-problem">&quot;archetype moves&quot;</a>. This makes this single spawn operation much more efficient!</p> +<p>These principles apply to the insert apis as well:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span>commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PlayerBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>ActivePlayer</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PlayerBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> ActivePlayer</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>They also apply to the remove apis:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span>commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">remove_bundle<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>PlayerBundle<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">remove<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ActivePlayer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">remove<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PlayerBundle, ActivePlayer<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="exclusive-system-rework">Exclusive System Rework +<a class="anchor-link" href="#exclusive-system-rework">#</a> +</h2> +<div class="release-feature-authors">authors: @cart, @maniwani</div> +<p>In preparation for the larger scheduler changes outlined in the newly-merged (but not yet implemented) <a href="https://github.com/bevyengine/rfcs/pull/45">Stageless RFC</a>, we've started blurring the lines between &quot;exclusive systems&quot; (systems with &quot;exclusive&quot; full mutable access to the ECS <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/world/struct.World.html"><code>World</code></a>) and normal systems, which historically have been separate types with strict lines between them.</p> +<p>In <strong>Bevy 0.9</strong>, exclusive systems now implement the normal <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/system/trait.System.html"><code>System</code></a> trait! This will ultimately have even larger implications, but in <strong>Bevy 0.9</strong> this means that you no longer need to call <code>.exclusive_system()</code> when adding exclusive systems to your schedule:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">some_exclusive_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_exclusive_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">exclusive_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_exclusive_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>We've also expanded exclusive systems to support more system parameters, which vastly improves the user experience of writing exclusive systems and makes them more efficient by caching state across executions.</p> +<p><a href="https://docs.rs/bevy/0.9.0/bevy/ecs/system/struct.SystemState.html"><code>SystemState</code></a> enables using &quot;normal&quot; system parameters from inside an exclusive system:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">some_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> state<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">SystemState<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> + <span class="z-meta z-path z-rust">SystemState<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>time<span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-modifier z-rust">mut</span> transforms</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> state<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">some_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World, <span class="z-variable z-parameter z-rust">state</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-meta z-generic z-rust">SystemState<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>time<span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-modifier z-rust">mut</span> transforms</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> state<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p><a href="https://docs.rs/bevy/0.9.0/bevy/ecs/query/struct.QueryState.html"><code>QueryState</code></a> enables cached access to individual queries:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">some_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> transforms <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">query<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-keyword z-control z-rust">for</span> transform <span class="z-keyword z-operator z-rust">in</span> transforms<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">some_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World, <span class="z-variable z-parameter z-rust">transforms</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-meta z-generic z-rust">QueryState<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> transform <span class="z-keyword z-operator z-rust">in</span> transforms<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p><a href="https://docs.rs/bevy/0.9.0/bevy/ecs/system/struct.Local.html"><code>Local</code></a> enables storing local data inside of the exclusive system:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Resource</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Counter</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">usize</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">some_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> counter <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">resource_mut<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Counter<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + counter<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span> <span class="z-keyword z-operator z-assignment z-rust">+=</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">some_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">counter</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Local<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">usize</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-operator z-arithmetic z-rust">*</span>counter <span class="z-keyword z-operator z-assignment z-rust">+=</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="bevy-ecs-now-uses-gats">Bevy ECS Now Uses GATS! +<a class="anchor-link" href="#bevy-ecs-now-uses-gats">#</a> +</h2> +<div class="release-feature-authors">authors: @BoxyUwU</div> +<p>Rust 1.65.0 <a href="https://blog.rust-lang.org/2022/11/03/Rust-1.65.0.html">stabilized GATs</a> (Generic Associated Types), which enabled us to significantly simplify Bevy ECS Query internals.</p> +<p>For awhile now, Bevy ECS has been hacking around the lack of GATs with a complicated nest of traits (<code>WorldQuery</code>, <code>WorldQueryGats</code> (a &quot;lack of real GATs hack&quot; trait), and <code>Fetch</code>).</p> +<p>In <strong>Bevy 0.9</strong>, we now have a single <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/query/trait.WorldQuery.html"><code>WorldQuery</code></a> trait! This makes Bevy ECS much easier to maintain, extend, debug, document, and understand.</p> +<h2 id="derive-resource">Derive Resource +<a class="anchor-link" href="#derive-resource">#</a> +</h2> +<div class="release-feature-authors">authors: @devil-ira, @alice-i-cecile</div> +<p>The <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/system/trait.Resource.html"><code>Resource</code></a> trait is now no longer automatically implemented for all types. It must be derived:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Resource</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Counter</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">usize</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This change was made on the tail of <a href="/news/bevy-0-6/#the-new-component-trait-and-derive-component">making the same decision</a> for <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/component/trait.Component.html"><code>Component</code></a> types. In short:</p> +<ol> +<li> +<p>Auto-implementing <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/system/trait.Resource.html"><code>Resource</code></a> for every type made it very easy to accidentally insert the &quot;wrong&quot; value, such as inserting the constructor function pointer instead of the value itself:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Counter</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">usize</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This inserts the constructor function pointer as a resource! +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Weird and confusing! +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Counter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This is how it should be done! +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Counter<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +</li> +<li> +<p>Deriving <a href="https://docs.rs/bevy/0.9.0/bevy/ecs/system/trait.Resource.html"><code>Resource</code></a> documents intent in a structured way. Without a derive, resource-ness is implicit by default.</p> +</li> +<li> +<p>Auto-implementing meant that plugins could use the same &quot;common&quot; type in conflicting ways (ex: <code>std</code> types like <code>Vec&lt;usize&gt;</code>). Not implementing by default means that plugins cannot use these common types in conflicting ways. They must create new types.</p> +</li> +<li> +<p>This opens the door to configuring resource types using the Rust type system (like we already do for components).</p> +</li> +</ol> +<h2 id="system-ambiguity-resolution-api-improvements">System Ambiguity Resolution API Improvements +<a class="anchor-link" href="#system-ambiguity-resolution-api-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @JoJoJet, @alice-i-cecile</div> +<p>Bevy ECS schedules systems to run in parallel by default. It will safely schedule systems in parallel, honoring dependencies between systems and enforcing Rust's mutability rules. By default, this means that if System A reads a resource and System B writes the resource (and they have no order defined between them), then System A might execute before <em>or</em> after System B. We call these systems &quot;ambiguous&quot;. In some situations this ambiguity might matter, in other situations it might not.</p> +<p>Bevy already has a <a href="https://bevyengine.org/news/bevy-0-5/#ambiguity-detection-and-resolution">system ambiguity detection system</a> which enables users to detect ambiguous systems and resolve the ambiguity (either by adding ordering constraints or ignoring the ambiguity). Users could add systems to &quot;ambiguity sets&quot; to ignore ambiguities between systems in these sets:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">AmbiguitySet</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">AmbiguousSystems</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_ambiguity_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>AmbiguousSystems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_ambiguity_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>AmbiguousSystems</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This was a bit hard to reason about and introduced more boilerplate than necessary.</p> +<p>In <strong>Bevy 0.9</strong>, we have replaced ambiguity sets with simpler <code>ambiguous_with</code> calls:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">ambiguous_with</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This builds on the existing [<code>SystemLabel</code>] approach, which means you can also use labels to accomplish &quot;set-like&quot; ambiguity resolution:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">SystemLabel</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Foo</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Foo</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Foo</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">ambiguous_with</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Foo</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h2 id="bevy-ecs-optimizations">Bevy ECS Optimizations +<a class="anchor-link" href="#bevy-ecs-optimizations">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132, @JoJoJet</div> +<p>We had some <em>huge</em> performance wins in <strong>Bevy 0.9</strong> thanks to <code>@james7132</code>:</p> +<ul> +<li>The Query fetch abstraction <a href="https://github.com/bevyengine/bevy/pull/4800">was reworked</a> to hoist common parts out of individual iteration, improving iterator performance on some benchmarks by ~10-20%. <code>Query::get</code> performance also saw some improvements.</li> +<li><a href="https://github.com/bevyengine/bevy/pull/6461">Some unnecessary branches were removed</a> from our data access apis, improving performance across most of our ECS benchmarks by ~5-20%!</li> +<li>The parallel executor <a href="https://github.com/bevyengine/bevy/pull/4919">now starts running systems</a> while the <code>prepare_systems</code> step is running, cutting out a lot of delay when there are many systems with very little work to do. This cut almost 1 millisecond from our <code>many_foxes</code> animation benchmark (~12% improvement). That is a <em>very</em> big deal!</li> +<li>Iterators now <a href="https://github.com/bevyengine/bevy/pull/4724">skip empty archetypes and tables</a> when iterating over queries, which significantly reduces per-archetype iteration overhead when the archetype is empty.</li> +</ul> +<p><code>@JoJoJet</code> <a href="https://github.com/bevyengine/bevy/pull/6400">also optimized</a> <code>Query::get_many</code> access by replacing <code>array::map</code> with loops, optimizing <code>get_many</code> by ~20-30%!</p> +<h2 id="ecs-change-detection-bypass">ECS Change Detection Bypass +<a class="anchor-link" href="#ecs-change-detection-bypass">#</a> +</h2> +<div class="release-feature-authors">authors: @alice-i-cecile</div> +<p>Bevy ECS automatically detects changes to components and resources thanks to some very fancy Rust usage.</p> +<p>However sometimes, a user might make a change that they don't want to be detected. In <strong>Bevy 0.9</strong>, change detection can now be bypassed:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">transforms</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> transform <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> transforms <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">bypass_change_detection</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span>translation<span class="z-punctuation z-accessor z-dot z-rust">.</span>x <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="enum-reflection">Enum Reflection +<a class="anchor-link" href="#enum-reflection">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV, @Davier, @nicopap</div> +<p>Bevy Reflect now has native support for Rust enums! Bevy Reflect is Bevy's &quot;Rust reflection system&quot;, which allows us to access Rust type information about values and types dynamically at runtime.</p> +<p>In past versions of Bevy, we needed to hack around Bevy Reflect's lack of enum support by treating enum types as &quot;reflected values&quot;, which required a lot more work for each type, and it provided less reflected information about the type:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Copy<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Debug<span class="z-punctuation z-separator z-rust">,</span> Default<span class="z-punctuation z-separator z-rust">,</span> Serialize<span class="z-punctuation z-separator z-rust">,</span> Deserialize<span class="z-punctuation z-separator z-rust">,</span> Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">reflect_value</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">PartialEq<span class="z-punctuation z-separator z-rust">,</span> Serialize<span class="z-punctuation z-separator z-rust">,</span> Deserialize</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">SomeEnum</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + A<span class="z-punctuation z-separator z-rust">,</span> + B<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">usize</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + C <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + foo<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + bar<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">bool</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">SomeEnum</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + A<span class="z-punctuation z-separator z-rust">,</span> + B<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">usize</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + C <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + foo<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + bar<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">bool</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>No more magic incantations!</p> +<p>Just like other reflected types, Enum reflection provides a lot of new runtime functionality:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Access variant names +</span><span class="z-storage z-type z-rust">let</span> value <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">SomeEnum<span class="z-punctuation z-accessor z-rust">::</span></span>A<span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>A<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">variant_name</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Get the variant type +</span><span class="z-keyword z-control z-rust">match</span> value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">variant_type</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">VariantType<span class="z-punctuation z-accessor z-rust">::</span></span>Unit <span class="z-keyword z-operator z-rust">=&gt;</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">VariantType<span class="z-punctuation z-accessor z-rust">::</span></span>Struct <span class="z-keyword z-operator z-rust">=&gt;</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">VariantType<span class="z-punctuation z-accessor z-rust">::</span></span>Tuple <span class="z-keyword z-operator z-rust">=&gt;</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + +<span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> value <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">SomeEnum<span class="z-punctuation z-accessor z-rust">::</span></span>C <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + foo<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">23</span><span class="z-punctuation z-separator z-rust">,</span> + bar<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-language z-rust">false</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Read/write specific fields by name +</span><span class="z-keyword z-operator z-arithmetic z-rust">*</span>value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">field_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>bar<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-constant z-language z-rust">true</span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Iterate over the entire collection of fields +</span><span class="z-keyword z-control z-rust">for</span> field <span class="z-keyword z-operator z-rust">in</span> value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_fields</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Detect the value type and retrieve information about it +</span><span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-path z-rust">TypeInfo<span class="z-punctuation z-accessor z-rust">::</span></span>Enum<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>info</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">type_info</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-path z-rust">VariantInfo<span class="z-punctuation z-accessor z-rust">::</span></span>Struct<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>struct_info</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">variant</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>C<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> first_field <span class="z-keyword z-operator z-assignment z-rust">=</span> struct_info<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">field_at</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>first_field<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">name</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>foo<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>Deriving <a href="https://docs.rs/bevy/0.9.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> on enums also automatically adds support for &quot;reflect-based serialization&quot;, which as of <strong>Bevy 0.9</strong> now <a href="/news/bevy-0-9/#new-scene-format">has a <em>much</em> nicer syntax</a>.</p> +<h2 id="other-bevy-reflect-improvements">Other Bevy Reflect Improvements +<a class="anchor-link" href="#other-bevy-reflect-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV, @makspll, @Shatur, @themasch, @NathanSWard</div> +<p>We've made a lot of other improvements to Bevy Reflect!</p> +<p>&quot;Container&quot; Reflect traits (Map, List, Array, Tuple) can now be drained to get owned values:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> container<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn List<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-type z-rust">Box</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> values<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn Reflect<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> container<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">drain</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Reflected fields can now opt out of serialization without <em>also</em> opting out of reflection as a whole:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Foo</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">a</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">i32</span>, + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> fully invisible to reflection, including serialization +</span> <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">reflect</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">ignore</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-variable z-other z-member z-rust">b</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">i32</span>, + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> can still be reflected, but will be skipped when serializing +</span> <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">reflect</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">skip_serializing</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-variable z-other z-member z-rust">c</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">i32</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Boxed &quot;reflection type&quot; traits (Struct, Enum, List, etc) can now be converted to the more generic <code>Box&lt;dyn Reflect&gt;</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> list<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn List<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-type z-rust">Box</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> reflect<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn Reflect<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> list<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into_reflect</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>It is now possible to get owned variants of reflected types:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Sprite<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-type z-rust">Box</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Sprite<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-path z-rust">ReflectOwned<span class="z-punctuation z-accessor z-rust">::</span></span>Struct<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>owned</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">reflect_owned</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> owned is a Box&lt;dyn Struct&gt; +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>Arrays in the &quot;reflection path API&quot; can now use list syntax:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Foo</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">bar</span><span class="z-punctuation z-separator z-type z-rust">:</span> [<span class="z-storage z-type z-rust">u8</span>; 3], +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-storage z-type z-rust">let</span> foo <span class="z-keyword z-operator z-assignment z-rust">=</span> Foo <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + bar<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-integer z-decimal z-rust">10</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">20</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">30</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-arithmetic z-rust">*</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_path</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>bar[1]<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">20</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Reflected Lists now have a pop operation:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> list<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn List<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-type z-rust">Box</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-storage z-type z-numeric z-rust">u8</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span><span class="z-storage z-type z-numeric z-rust">u8</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn Reflect<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> list<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">pop</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-arithmetic z-rust">*</span>value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">downcast<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u8</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span><span class="z-storage z-type z-numeric z-rust">u8</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="example-gamepad-viewer">Example: Gamepad Viewer +<a class="anchor-link" href="#example-gamepad-viewer">#</a> +</h2> +<div class="release-feature-authors">authors: @rparrett</div> +<p>Bevy now has a gamepad input viewer app, which can be run using <code>cargo run --example gamepad_viewer</code> from the Bevy repo.</p> +<p><video controls loop><source src="gamepad.mp4" type="video/mp4"/></video></p> +<h2 id="axis-and-button-settings-validation">Axis and Button Settings Validation +<a class="anchor-link" href="#axis-and-button-settings-validation">#</a> +</h2> +<div class="release-feature-authors">authors: @mfdorst, @targrub</div> +<p>[<code>InputAxis</code>] and [<code>ButtonSettings</code>] now use getters and setters to ensure the integrity of the settings. Setters will return an error instead of allowing invalid state.</p> +<p>For example, attempting to set the &quot;press threshold&quot; of a button to a value lower than the &quot;release threshold&quot; will result in an error:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">button_settings<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set_release_threshold</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">65</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this is too low! +</span><span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>button_settings<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">try_set_press_threshold</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">6</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">is_err</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h2 id="scancode-input-resource">ScanCode Input Resource +<a class="anchor-link" href="#scancode-input-resource">#</a> +</h2> +<div class="release-feature-authors">authors: @Bleb1k</div> +<p><strong>Bevy 0.9</strong> adds an <code>Input&lt;ScanCode&gt;</code> resource, which behaves like <code>Input&lt;KeyCode&gt;</code>, but ignores keyboard layout:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">scan_code</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Input<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ScanCode<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">key_code</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Input<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>KeyCode<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> 33 is the scan code for F on a physical keyboard +</span> <span class="z-keyword z-control z-rust">if</span> scan_code<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">pressed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>ScanCode<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">33</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">log!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>The physical F key is pressed on the keyboard<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-keyword z-control z-rust">if</span> keycode<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">pressed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">KeyCode<span class="z-punctuation z-accessor z-rust">::</span></span>F</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">log!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>The logical F key is pressed on the keyboard, taking layout into account.<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="time-shader-globals">Time Shader Globals +<a class="anchor-link" href="#time-shader-globals">#</a> +</h2> +<div class="release-feature-authors">authors: @IceSentry</div> +<p>Bevy shaders <em>finally</em> have access to built-in time values, removing the need for users to calculate time values and pass them in manually. Time is very useful in shaders, as it opens the doors to animating values.</p> +<p>Here is a simple shader that animates between a black and red color using the time:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-operator z-rust">@</span>fragment +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">fragment</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">in</span><span class="z-punctuation z-separator z-rust">:</span> FragmentInput</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> </span></span><span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">location</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">return</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-support z-function z-rust">sin</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>globals<span class="z-punctuation z-accessor z-dot z-rust">.</span>time <span class="z-keyword z-operator z-arithmetic z-rust">*</span> <span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p><video controls loop><source src="blinking_cube.mp4" type="video/mp4"/></video></p> +<p>Bevy Shaders now have access to the following globals:</p> +<ul> +<li><code>time</code>: time since startup in seconds, wrapping to 0 after 1 hour</li> +<li><code>delta_time</code>: time since the previous frame in seconds</li> +<li><code>frame_count</code>: frame count since the start of the app, wrapping to 0 after reaching the max size of a <code>u32</code></li> +</ul> +<h2 id="high-entity-renderer-slowdown-optimization">High Entity Renderer Slowdown Optimization +<a class="anchor-link" href="#high-entity-renderer-slowdown-optimization">#</a> +</h2> +<div class="release-feature-authors">authors: @TheRawMeatball</div> +<p><a href="/news/bevy-0-6/#the-new-bevy-renderer">Bevy's renderer</a> synchronizes entity state between the &quot;main world&quot; and the &quot;render world&quot;, which enables parallel pipelined rendering. To implement this, we clear out the render entities every frame to ensure the integrity of the extracted state.</p> +<p>However, it became apparent that the method we were using to clear entities each frame was incurring a per-entity cost that became notable at very high entity counts.</p> +<p>In <strong>Bevy 0.9</strong>, we have significantly optimized the entity clearing, which cuts the cost of clearing 5,000,000 entities from ~360 microseconds to ~120 microseconds. We are also considering a &quot;retained state&quot; extraction model, piggybacking on Bevy ECS's built in change detection, which would remove the need to clear entities entirely (and optimize the extraction processes more generally). Implementing that will be a much larger effort though!</p> +<h2 id="vertex-attributes-fully-optional">Vertex Attributes Fully Optional +<a class="anchor-link" href="#vertex-attributes-fully-optional">#</a> +</h2> +<div class="release-feature-authors">authors: @IceSentry</div> +<p>In a previous release we <a href="/news/bevy-0-7/#flexible-mesh-vertex-layouts">made it possible to make vertex attributes optional by specializing on mesh vertex attributes</a>. But we left a couple of the common attributes as required: the position and the normal. <strong>Bevy 0.9</strong> finishes the job. All standard mesh vertex attributes are now completely optional. If your mesh doesn't need positions for some reason, Bevy won't stop you!</p> +<h2 id="expose-multi-draw-indirect">Expose Multi Draw Indirect +<a class="anchor-link" href="#expose-multi-draw-indirect">#</a> +</h2> +<div class="release-feature-authors">authors: @Neo-Zhixing</div> +<p>Wgpu has opt-in support for &quot;multi draw indirect&quot; apis on platforms that support them, which are a key piece of implementing efficient &quot;gpu driven rendering&quot;. Bevy now exposes these apis through its &quot;tracked render pass&quot; abstraction, enabling developers to build render features using these apis.</p> +<h2 id="ktx2-array-cubemap-cubemap-array-textures">KTX2 Array / Cubemap / Cubemap Array Textures +<a class="anchor-link" href="#ktx2-array-cubemap-cubemap-array-textures">#</a> +</h2> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p>Bevy can now properly load KTX2 array, cubemap, and cubemap array texture assets, which opens the doors to scenarios like skyboxes:</p> +<p><video controls loop><source src="skybox.mp4" type="video/mp4"/></video></p> +<p>Bevy doesn't yet have high level support for skyboxes, but we have an example that <a href="https://github.com/bevyengine/bevy/blob/v0.9.0/examples/3d/skybox.rs">illustrates how this feature can be implemented by users</a></p> +<h2 id="camera-viewport-to-world">Camera::viewport_to_world +<a class="anchor-link" href="#camera-viewport-to-world">#</a> +</h2> +<div class="release-feature-authors">authors: @devil-ira</div> +<p>It is often desirable to convert a position &quot;on the screen&quot; to a ray at that position facing out from the camera. For example, if you want to click on something in a 3D scene to select it, you might cast a ray from that point in the camera's view and see if it intersect with any &quot;colliders&quot; in the scene.</p> +<p>Bevy cameras now have a <a href="https://docs.rs/bevy/0.9.0/bevy/render/camera/struct.Camera.html#method.viewport_to_world"><code>viewport_to_world</code></a> function, which provides this functionality:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> ray <span class="z-keyword z-operator z-assignment z-rust">=</span> camera<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">viewport_to_world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>transform<span class="z-punctuation z-separator z-rust">,</span> cursor_position</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> physics_context<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">cast_ray</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>ray<span class="z-punctuation z-accessor z-dot z-rust">.</span>origin<span class="z-punctuation z-separator z-rust">,</span> ray<span class="z-punctuation z-accessor z-dot z-rust">.</span>direction</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> select entity +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>The following cursor-driven selection uses <a href="https://docs.rs/bevy/0.9.0/bevy/render/camera/struct.Camera.html#method.viewport_to_world"><code>viewport_to_world</code></a> to calculate the ray coming &quot;out&quot; of the cursor, then feeds it into the <a href="https://rapier.rs/docs/user_guides/bevy_plugin/getting_started_bevy"><code>bevy_rapier</code></a> physics library to detect and pick up the card under the cursor:</p> +<p><video controls loop><source src="viewport_to_world.mp4" type="video/mp4"/></video></p> +<h2 id="multiple-directional-lights">Multiple Directional Lights +<a class="anchor-link" href="#multiple-directional-lights">#</a> +</h2> +<div class="release-feature-authors">authors: @kurtkuehnert</div> +<p>Bevy now supports multiple directional lights (the new limit is 10 at once). Much like we did for point lights, we will likely make this unbounded on platforms that support storage buffers in the future, but this was a nice first step that maintains compatibility on all platforms.</p> +<p><img src="https://bevyengine.org/news/bevy-0-9/multiple_directional.png" alt="multiple directional" /></p> +<h2 id="sprite-rects">Sprite Rects +<a class="anchor-link" href="#sprite-rects">#</a> +</h2> +<div class="release-feature-authors">authors: @inodentry</div> +<p><a href="https://docs.rs/bevy/0.9.0/bevy/sprite/struct.Sprite.html"><code>Sprites</code></a> can now define &quot;rects&quot; that select a specific area of their texture to be used as the &quot;sprite&quot;:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">Sprite <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + rect<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Rect <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + min<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Vec2<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">100.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + max<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Vec2<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">200.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">100.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p><img src="https://bevyengine.org/news/bevy-0-9/sprite_rect.png" alt="sprite rect" /></p> +<p>This is similar to how <a href="https://docs.rs/bevy/0.9.0/bevy/sprite/struct.TextureAtlasSprite.html"><code>TextureAtlasSprite</code></a> / &quot;sprite sheets&quot; work, but without the need to define a texture atlas.</p> +<h2 id="plugin-settings">Plugin Settings +<a class="anchor-link" href="#plugin-settings">#</a> +</h2> +<div class="release-feature-authors">authors: @cart, @mockersf</div> +<p>In past versions of Bevy, &quot;immutable&quot; Plugin settings were represented as normal ECS resources, which were read as part of plugin init. This presented a number of problems:</p> +<ol> +<li>If a user inserted the plugin settings resource after the plugin was initialized, it would be silently ignored (and use the defaults instead)</li> +<li>Users could modify the plugin settings resource after the plugin had been initialized. This created a false sense of control over settings that could no longer be changed.</li> +</ol> +<p>These were especially problematic and confusing for the <code>WindowDescriptor</code> resource, but it was a general problem.</p> +<p>To resolve this, in <strong>Bevy 0.9</strong> we moved plugin settings onto the plugins themselves, and created new apis for overriding the default settings:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>DefaultPlugins + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>AssetPlugin <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + watch_for_changes<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-language z-rust">true</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>WindowPlugin <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + window<span class="z-punctuation z-separator z-rust">:</span> WindowDescriptor <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + width<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">400.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This makes the connection between the settings and the plugin clear, and differentiates these &quot;plugin init&quot; settings from &quot;runtime configurable&quot; settings (which are still represented as ECS resources).</p> +<h2 id="plugins-are-now-unique-by-default">Plugins Are Now Unique By Default +<a class="anchor-link" href="#plugins-are-now-unique-by-default">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>Plugins are now unique by default. Attempting to add a unique plugin to an app more than once will result in an error. Plugins that are not intended to be unique can override the default <code>is_unique</code> method:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">Plugin <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">MyPlugin</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">build</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-variable z-parameter z-rust">self</span>, <span class="z-variable z-parameter z-rust">app</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> App</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">is_unique</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-variable z-parameter z-rust">self</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> <span class="z-storage z-type z-rust">bool</span></span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-constant z-language z-rust">false</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="task-pool-nested-spawns-on-scope">Task Pool: Nested Spawns on Scope +<a class="anchor-link" href="#task-pool-nested-spawns-on-scope">#</a> +</h2> +<div class="release-feature-authors">authors: @hymm</div> +<p>Bevy's Task Pools now support &quot;nested spawns on scopes&quot;:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> results <span class="z-keyword z-operator z-assignment z-rust">=</span> task_pool<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">scope</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">scope</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + scope<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>async <span class="z-storage z-modifier z-rust">move</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + scope<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>async <span class="z-storage z-modifier z-rust">move</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>results<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">contains</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>results<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">contains</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-constant z-numeric z-integer z-decimal z-rust">2</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This enables adding new tasks to the task pool scope while performing other tasks! This was a requirement for implementing the newly merged (but not yet implemented) <a href="https://github.com/bevyengine/rfcs/pull/45">Stageless RFC</a>, but it enables new patterns for anyone spawning async tasks in Bevy!</p> +<h2 id="task-pool-panic-handling">Task Pool Panic Handling +<a class="anchor-link" href="#task-pool-panic-handling">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132</div> +<p>Bevy uses its own custom async task pools to manage scheduling parallel, async tasks. In previous versions of Bevy, if a task panicked in one of these pools, it would be non-recoverable unless every scheduled task used <code>catch_unwind</code> (which isn't feasible). This would also permanently kill worker threads in the global task pools.</p> +<p><strong>Bevy 0.9</strong> resolves this problem by calling <code>catch_unwind</code> inside the task pool executors.</p> +<h2 id="hierarchy-query-methods">Hierarchy Query Methods +<a class="anchor-link" href="#hierarchy-query-methods">#</a> +</h2> +<div class="release-feature-authors">authors: @devil-ira</div> +<p>To make navigating hierarchies easier, we've added some convenience methods to <code>Query&lt;&amp;Children&gt;</code> and <code>Query&lt;&amp;Parent&gt;</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Resource</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">SomeEntity</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Entity</span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">children</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Children<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">some_entity</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEntity<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> iterate all descendents of some_entity +</span> <span class="z-keyword z-control z-rust">for</span> entity <span class="z-keyword z-operator z-rust">in</span> children<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_descendants</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_entity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">other_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">parents</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Parent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">some_entity</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEntity<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> iterate all ancestors of some_entity +</span> <span class="z-keyword z-control z-rust">for</span> entity <span class="z-keyword z-operator z-rust">in</span> parents<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_ancestors</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_entity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="bevy-ui-the-origin-is-now-in-the-top-left">Bevy UI: The Origin Is Now In The Top Left +<a class="anchor-link" href="#bevy-ui-the-origin-is-now-in-the-top-left">#</a> +</h2> +<div class="release-feature-authors">authors: @mahulst</div> +<p>Bevy UI now considers the &quot;top left&quot; of the window to be the &quot;origin&quot; and it extends &quot;downward&quot; (Y-down). To illustrate, consider the following cases where a widget spawned in the &quot;default&quot; location (at the origin).</p> +<h3 id="top-left-origin-new">Top Left Origin (New) +<a class="anchor-link" href="#top-left-origin-new">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-9/origin_top_left.png" alt="origin top left" /></p> +<h3 id="bottom-left-origin-old">Bottom Left Origin (Old) +<a class="anchor-link" href="#bottom-left-origin-old">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-9/origin_bottom_left.png" alt="origin bottom left" /></p> +<p>We chose to make this change because pretty much the <em>entire</em> UI ecosystem uses top left as the origin (Web, Godot, GTK, GPU images, etc).</p> +<p>In the early days when Bevy was still in its infancy, I (<code>@cart</code>) originally opted for bottom left (Y-up) for consistency with Bevy's world space 2D and 3D coordinate systems. In theory, I figured this would make everything easier to reason about. But in practice, it turns out this consistency won us nothing. And the behavior defied users' expectations when it came to UI default behaviors. UIs tend to extend downward (from the top), not upward (from the bottom), so overriding the defaults was common practice.</p> +<p>Fortunately, in <strong>Bevy 0.9</strong> we're now aligned with the rest of the ecosystem!</p> +<h2 id="bevy-ui-z-indices">Bevy UI: Z-Indices +<a class="anchor-link" href="#bevy-ui-z-indices">#</a> +</h2> +<div class="release-feature-authors">authors: @oceantume</div> +<p>Bevy UI elements now have more control over their &quot;z index&quot; (whether or not they are &quot;in front&quot; or &quot;behind&quot; each other). In past versions of Bevy, this was determined entirely by hierarchy: children stack on top of parents and earlier siblings. This is a nice &quot;default&quot; and works for a good portion of UIs, but some types of UI need more control over element ordering.</p> +<p>If you are a web developer and you have ever reached for the <code>z-index</code> css property, that is the problem we're discussing here.</p> +<p><strong>Bevy 0.9</strong> adds a new <a href="https://docs.rs/bevy/0.9.0/bevy/ui/enum.ZIndex.html"><code>ZIndex</code></a> component, which is an enum with two modes:</p> +<ul> +<li><code>ZIndex::Local(i32)</code>: Overrides the depth relative to its siblings.</li> +<li><code>ZIndex::Global(i32)</code>: Overrides the depth relative to the UI root. Setting this essentially allows UI elements to &quot;escape&quot; z-ordering relative to their parents and instead be ordered relative to the entire UI.</li> +</ul> +<p>UI items with a higher z-level within the context (local vs global) will show up in front of UI items with a lower z-level. Ties within a z-level fall back to hierarchy order. &quot;Later&quot; children stack on top of &quot;earlier&quot; children.</p> +<p>To illustrate, consider the following UI:</p> +<pre data-lang="txt" class="language-txt z-code"><code class="language-txt" data-lang="txt"><span class="z-text z-plain">root (green) + child1 (red) + child2 (blue) +</span></code></pre> +<p>By default these all have a z-index of 0. The root is at the bottom and each subsequent child stacks &quot;on top&quot;:</p> +<p><img src="https://bevyengine.org/news/bevy-0-9/z-default.png" alt="z-index default" /></p> +<p>If we want the blue child to stack &quot;behind&quot; the earlier red child, we can set its z-index to a &quot;local&quot; value smaller than the default of 0:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">blue<span class="z-punctuation z-accessor z-dot z-rust">.</span>z_index <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">ZIndex<span class="z-punctuation z-accessor z-rust">::</span></span>Local<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-arithmetic z-rust">-</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><img src="https://bevyengine.org/news/bevy-0-9/z-blue-local.png" alt="z-index blue local" /></p> +<p>If we want the blue child to stack &quot;behind&quot; the green root, we can set its z-index to a &quot;global&quot; value smaller than the default of 0:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">blue<span class="z-punctuation z-accessor z-dot z-rust">.</span>z_index <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">ZIndex<span class="z-punctuation z-accessor z-rust">::</span></span>Global<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-arithmetic z-rust">-</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><img src="https://bevyengine.org/news/bevy-0-9/z-blue-global.png" alt="z-index blue global" /></p> +<p>Very useful stuff!</p> +<h2 id="bevy-ui-scaling">Bevy UI Scaling +<a class="anchor-link" href="#bevy-ui-scaling">#</a> +</h2> +<div class="release-feature-authors">authors: @Weibye</div> +<p>Bevy UI's global &quot;pixel scale&quot; can now be set using the <a href="https://docs.rs/bevy/0.9.0/bevy/ui/struct.UiScale.html"><code>UiScale</code></a> resource:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Render UI pixel units 2x bigger +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>UiScale <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> scale<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This allows developers to expose arbitrary scale configuration to users in cases where that flexibility is beneficial.</p> +<p><video controls loop><source src="ui_scaling.mp4" type="video/mp4"/></video></p> +<h2 id="audio-playback-toggling">Audio Playback Toggling +<a class="anchor-link" href="#audio-playback-toggling">#</a> +</h2> +<div class="release-feature-authors">authors: @lovelymono</div> +<p>It is now possible to toggle audio playback, which will flip between playing and pausing:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old, manual toggling (still possible) +</span><span class="z-keyword z-control z-rust">if</span> audio_sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">is_paused</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + audio_sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> <span class="z-keyword z-control z-rust">else</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + audio_sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">pause</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New, automatic toggling +</span>audio_sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">toggle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="time-scaling">Time Scaling +<a class="anchor-link" href="#time-scaling">#</a> +</h2> +<div class="release-feature-authors">authors: @maniwani</div> +<p>The &quot;global&quot; time scale can now be configured on <a href="https://docs.rs/bevy/0.9.0/bevy/time/struct.Time.html"><code>Time</code></a>, which scales the values common functions like <code>Time::delta_seconds()</code> return.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set_relative_speed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>In cases where unscaled values are required, you can use the new &quot;raw&quot; variants of these functions:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The number of seconds elapsed since the last update, with time scaling taken into account. +</span><span class="z-storage z-type z-rust">let</span> delta <span class="z-keyword z-operator z-assignment z-rust">=</span> time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">delta_seconds</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The number of seconds elapsed since the last update, with time scaling ignored. +</span><span class="z-storage z-type z-rust">let</span> raw_delta <span class="z-keyword z-operator z-assignment z-rust">=</span> time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">raw_delta_seconds</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><video controls loop><source src="time_scale.mp4" type="video/mp4"/></video></p> +<h2 id="time-wrapping">Time Wrapping +<a class="anchor-link" href="#time-wrapping">#</a> +</h2> +<div class="release-feature-authors">authors: @IceSentry</div> +<p>Some scenarios, <a href="/news/bevy-0-9/#time-shader-globals">such as shaders</a>, need to represent elapsed time values as <code>f32</code>, which will suffer from precision issues pretty quickly. To resolve this, <a href="https://docs.rs/bevy/0.9.0/bevy/time/struct.Time.html"><code>Time</code></a> has been extended to support &quot;time wrapping&quot;:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Wrap once every hour +</span>time<span class="z-punctuation z-accessor z-dot z-rust">.</span>wrapping_period <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">Duration<span class="z-punctuation z-accessor z-rust">::</span></span>from_secs<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">60</span> <span class="z-keyword z-operator z-arithmetic z-rust">*</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">60</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">:</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> If one hour and 6 seconds have passed since the app started, +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this will return 6 seconds. +</span><span class="z-storage z-type z-rust">let</span> wrapped <span class="z-keyword z-operator z-assignment z-rust">=</span> time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">seconds_since_startup_wrapped_f32</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="what-s-next">What's Next? +<a class="anchor-link" href="#what-s-next">#</a> +</h2> +<p>Here are some of the things</p> +<ul> +<li><strong>High Level Post Processing Stack</strong>: Now that we have the core post processing pipeline in place, we need to make a higher level system that makes it easier for users to select, configure, and re-order post processing effects on a per-camera basis. Additionally for performance reasons we want to combine as many post processing effects into a single pass as we can, so we need an opinionated set of post processing apis that facilitate this.</li> +<li><strong>More Post Processing Effects</strong>: More anti-aliasing options (TAA, SMAA), more tonemapping algorithm options (Ex: ACES), SSAO</li> +<li><strong>Asset Preprocessing</strong>: We will be investing heavily in our asset pipeline, with a focus on: +<ol> +<li>Pre-processing assets to do expensive work &quot;during development time&quot;, so Bevy Apps can be deployed with assets that are prettier, smaller, and/or faster to load.</li> +<li>Enabling configuring assets with .meta files. For example, you could define a texture compression level, the filter it should use, or the target format.</li> +</ol> +</li> +<li><strong>Bevy UI Improvements</strong>: We will continue improving Bevy UI's functionality and expanding its widget library, with a focus on enabling editor experiences.</li> +<li><strong>More Scene Improvements</strong>: Nested scenes, implicit defaults, and inline assets.</li> +<li><strong>Bevy Editor</strong>: We will start prototyping Bevy Editor experiences, starting with scene editor tooling.</li> +<li><strong>Stageless ECS</strong>: Now that the <a href="https://github.com/bevyengine/rfcs/pull/45">Stageless RFC</a> is merged, we can start implementing stageless scheduling! See the RFC for an outline of the improvements coming. This will be a game changer!</li> +</ul> +<p>We're also looking for experts in some key areas. Most of our current devs are focused on the efforts above, so if you have interest and experience in the following areas, we would love to hear from you!</p> +<ul> +<li><strong>Animation</strong>: Animation blending, procedural animation, and higher level animation systems. Check out the issues labeled <a href="https://github.com/bevyengine/bevy/labels/A-Animation"><code>A-Animation</code></a> on GitHub and introduce yourself on the <a href="https://discord.com/channels/691052431525675048/774027865020039209"><code>#animation-dev</code></a> channel of our Discord.</li> +<li><strong>Audio</strong>: We need more control over audio playback, especially when it comes to layering effects. Check out the issues labeled <a href="https://github.com/bevyengine/bevy/labels/A-Audio"><code>A-Audio</code></a> on GitHub and introduce yourself on the <a href="https://discord.com/channels/691052431525675048/749430447326625812"><code>#audio-dev</code></a> channel of our Discord.</li> +</ul> +<h2 id="support-bevy">Support Bevy +<a class="anchor-link" href="#support-bevy">#</a> +</h2> +<p>Sponsorships help make our work on Bevy sustainable. If you believe in Bevy's mission, consider sponsoring us ... every bit helps!</p> +<ul> +<li><strong><a href="https://github.com/sponsors/cart">Carter Anderson (@cart)</a></strong>: Full-time lead developer, project manager, and creator of Bevy. Focused on building out core engine systems, guiding project direction, and managing the community.</li> +<li><strong><a href="https://github.com/sponsors/alice-i-cecile">Alice Cecile (@alice-i-cecile)</a></strong>: Technical project manager, mad scientist, and documentation lead. While she regularly leads expeditions into new domains, ECS will always be home base.</li> +<li><strong><a href="https://github.com/sponsors/mockersf">François Mockers (@mockersf)</a></strong>: CI whisperer. Making sure everything is running smoothly and improving Bevy one PR at a time.</li> +<li><strong>Rob Swain (@superdump)</strong>: Wielder of light. Turning data into shiny with massive parallelism. Currently hobby hacking so please donate to/sponsor the rest of the team. ❤️</li> +</ul> +<h2 id="contributors">Contributors +<a class="anchor-link" href="#contributors">#</a> +</h2> +<p>A huge thanks to the <strong>159 contributors</strong> that made this release (and associated docs) possible! In random order:</p> +<ul> +<li>@Edwox</li> +<li>@targrub</li> +<li>@fvacek</li> +<li>@xtr3m3nerd</li> +<li>@timokoesters</li> +<li>@Suficio</li> +<li>@Sergi-Ferrez</li> +<li>@hymm</li> +<li>@MrGVSV</li> +<li>@SleepySwords</li> +<li>@nicopap</li> +<li>@Vrixyz</li> +<li>@McSpidey</li> +<li>@VitalyAnkh</li> +<li>@ramirezmike</li> +<li>@jiftoo</li> +<li>@TheNeikos</li> +<li>@ManevilleF</li> +<li>@KDecay</li> +<li>@Zearin</li> +<li>@marlyx</li> +<li>@StarArawn</li> +<li>@Ixentus</li> +<li>@hmeine</li> +<li>@emersonmx</li> +<li>@gilescope</li> +<li>@inodentry</li> +<li>@robtfm</li> +<li>@yrns</li> +<li>@Lucidus115</li> +<li>@kurtkuehnert</li> +<li>@zmarlon</li> +<li>@leereilly</li> +<li>@galkowskit</li> +<li>@DGriffin91</li> +<li>@Ptrskay3</li> +<li>@strattonbrazil</li> +<li>@Pand9</li> +<li>@PROMETHIA-27</li> +<li>@zicklag</li> +<li>@lewiszlw</li> +<li>@contagnas</li> +<li>@EMachad0</li> +<li>@SpecificProtagonist</li> +<li>@BoxyUwU</li> +<li>@jkb0o</li> +<li>@xgbwei</li> +<li>@andresovela</li> +<li>@0x182d4454fb211940</li> +<li>@TehPers</li> +<li>@pcone</li> +<li>@CleanCut</li> +<li>@makspll</li> +<li>@64kramsystem</li> +<li>@Wandalen</li> +<li>@coreh</li> +<li>@Fracey</li> +<li>@Azervu</li> +<li>@SyamaMishra</li> +<li>@BeastLe9enD</li> +<li>@Weibye</li> +<li>@Pietrek14</li> +<li>@NiklasEi</li> +<li>@TheRawMeatball</li> +<li>@jgoday</li> +<li>@7flash</li> +<li>@light4</li> +<li>@Ian-Yy</li> +<li>@Carter0</li> +<li>@slyedoc</li> +<li>@devil-ira</li> +<li>@MDeiml</li> +<li>@NathanSWard</li> +<li>@robem</li> +<li>@Bleb1k</li> +<li>@bzm3r</li> +<li>@anchpop</li> +<li>@aevyrie</li> +<li>@amiani</li> +<li>@x3ro</li> +<li>@NoahShomette</li> +<li>@bjorn3</li> +<li>@djeedai</li> +<li>@bwhitt7</li> +<li>@oceantume</li> +<li>@micron-mushroom</li> +<li>@JMS55</li> +<li>@asherkin</li> +<li>@afonsolage</li> +<li>@shuoli84</li> +<li>@harudagondi</li> +<li>@Demiu</li> +<li>@TimJentzsch</li> +<li>@gak</li> +<li>@dataphract</li> +<li>@raffimolero</li> +<li>@Moulberry</li> +<li>@james7132</li> +<li>@torsteingrindvik</li> +<li>@jakobhellermann</li> +<li>@hakolao</li> +<li>@themasch</li> +<li>@CatThingy</li> +<li>@Metadorius</li> +<li>@merelymyself</li> +<li>@SludgePhD</li> +<li>@CGMossa</li> +<li>@sullyj3</li> +<li>@ian-h-chamberlain</li> +<li>@lain-dono</li> +<li>@mwcz</li> +<li>@thebluefish</li> +<li>@manokara</li> +<li>@mirkoRainer</li> +<li>@hankjordan</li> +<li>@cryscan</li> +<li>@WaffleLapkin</li> +<li>@mahulst</li> +<li>@AlexOkafor</li> +<li>@Davier</li> +<li>@jwagner</li> +<li>@CAD97</li> +<li>@alice-i-cecile</li> +<li>@james-j-obrien</li> +<li>@rparrett</li> +<li>@tguichaoua</li> +<li>@YohDeadfall</li> +<li>@msvbg</li> +<li>@komadori</li> +<li>@maniwani</li> +<li>@Shatur</li> +<li>@LarsDu</li> +<li>@DJMcNab</li> +<li>@JoJoJet</li> +<li>@polarvoid</li> +<li>@KirmesBude</li> +<li>@Aceeri</li> +<li>@ottah</li> +<li>@IceSentry</li> +<li>@Piturnah</li> +<li>@lovelymono</li> +<li>@maxwellodri</li> +<li>@oledfish</li> +<li>@BorisBoutillier</li> +<li>@mockersf</li> +<li>@Nilirad</li> +<li>@elbertronnie</li> +<li>@maccesch</li> +<li>@vertesians</li> +<li>@superdump</li> +<li>@wanderrful</li> +<li>@Neo-Zhixing</li> +<li>@rustui</li> +<li>@cart</li> +<li>@JohnTheCoolingFan</li> +<li>@pascualex</li> +<li>@fishykins</li> +<li>@Carlrs</li> +<li>@leath-dub</li> +</ul> +<h2 id="full-change-log">Full Change Log +<a class="anchor-link" href="#full-change-log">#</a> +</h2> +<h3 id="added">Added +<a class="anchor-link" href="#added">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/6397">Bloom</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6393">Add FXAA postprocessing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5264">Fix color banding by dithering image before quantization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6336">Plugins own their settings. Rework PluginGroup trait.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5752">Add global time scaling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5409">add globals to mesh view bind group</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5814">Add UI scaling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6422">Add FromReflect for Timer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6357">Re-add local bool <code>has_received_time</code> in <code>time_system</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6248">Add default implementation of Serialize and Deserialize to Timer and Stopwatch</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5982">add time wrapping to Time</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5978">Stopwatch elapsed secs f64</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5971">Remaining fn in Timer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5325">Support array / cubemap / cubemap array textures in KTX2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6158">Add methods for silencing system-order ambiguity warnings</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6437">bevy_dynamic_plugin: make it possible to handle loading errors</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6372">can get the settings of a plugin from the app</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6360">Use plugin setup for resource only used at setup time</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6159">Add <code>TimeUpdateStrategy</code> resource for manual <code>Time</code> updating</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6227">dynamic scene builder</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6229">Create a scene from a dynamic scene</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5952">Scene example: write file in a task</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5949">Add writing of scene data to Scene example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5855">can clone a scene</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6468">Add &quot;end of main pass post processing&quot; render graph node</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6126">Add <code>Camera::viewport_to_world</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6014">Sprite: allow using a sub-region (Rect) of the image</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5758">Add missing type registrations for bevy_math types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6423">Add <code>serialize</code> feature to <code>bevy_core</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6379">add serialize feature to bevy_transform</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5340">Add associated constant <code>IDENTITY</code> to <code>Transform</code> and friends.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6502">bevy_reflect: Add <code>Reflect::into_reflect</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6494">Add reflect_owned</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6488"><code>Reflect</code> for <code>Tonemapping</code> and <code>ClusterConfig</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6429">add <code>ReflectDefault</code> to std types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6410">Add FromReflect for Visibility</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6308">Register <code>RenderLayers</code> type in <code>CameraPlugin</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6257">Enable Constructing ReflectComponent/Resource</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6237">Support multiple <code>#[reflect]</code>/<code>#[reflect_value]</code> + improve error messages</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6200">Reflect Default for GlobalTransform</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6193">Impl Reflect for PathBuf and OsString</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6187">Reflect Default for <code>ComputedVisibility</code> and <code>Handle&lt;T&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6152">Register <code>Wireframe</code> type</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6015">Derive <code>FromReflect</code> for <code>Transform</code> and <code>GlobalTransform</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5987">Make arrays behave like lists in reflection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5948">Implement <code>Debug</code> for dynamic types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5806">Implemented <code>Reflect</code> for all the ranges</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5797">Add <code>pop</code> method for <code>List</code> trait.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5782">bevy_reflect: <code>GetTypeRegistration</code> for <code>SmallVec&lt;T&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5747">register missing reflect types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5728">bevy_reflect: Get owned fields</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5720">bevy_reflect: Add <code>FromReflect</code> to the prelude</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5676">implement <code>Reflect</code> for <code>Input&lt;T&gt;</code>, some misc improvements to reflect value derive</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5664">register <code>Cow&lt;'static, str&gt;</code> for reflection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5658">bevy_reflect: Relax bounds on <code>Option&lt;T&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5630">remove <code>ReflectMut</code> in favor of <code>Mut&lt;dyn Reflect&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5626">add some info from <code>ReflectPathError</code> to the error messages</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5556">Added reflect/from reflect impls for NonZero integer types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5473">bevy_reflect: Update enum derives</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5250">Add <code>reflect(skip_serializing)</code> which retains reflection but disables automatic serialization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4761">bevy_reflect: Reflect enums</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5993">Disabling default features support in bevy_ecs, bevy_reflect and bevy</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6331">expose window alpha mode</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6180">Make bevy_window and bevy_input events serializable</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5813">Add window resizing example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6342">feat: add GamepadInfo, expose gamepad names</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6232">Derive <code>Reflect</code> + <code>FromReflect</code> for input types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6191">Make TouchInput and ForceTouch serializable</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6074">Add a Gamepad Viewer tool to examples</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6023">Derived <code>Copy</code> trait for <code>bevy_input</code> events, <code>Serialize</code>/<code>Deserialize</code> for events in <code>bevy_input</code> and <code>bevy_windows</code>, <code>PartialEq</code> for events in both, and <code>Eq</code> where possible in both.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5853">Support for additional gamepad buttons and axis</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5495">Added keyboard scan input event</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6189">Add <code>set_parent</code> and <code>remove_parent</code> to <code>EntityCommands</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6185">Add methods to <code>Query&lt;&amp;Children&gt;</code> and <code>Query&lt;&amp;Parent&gt;</code> to iterate over descendants and ancestors</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6444">Add <code>is_finished</code> to <code>Task&lt;T&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5857">Expose mint feature in bevy_math/glam</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6134">Utility methods for Val</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6029">Register missing bevy_text types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5988">Add additional constructors for <code>UiRect</code> to specify values for specific fields</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5761">Add AUTO and UNDEFINED const constructors for <code>Size</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4992">Add Exponential Moving Average into diagnostics</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6515">Add <code>send_event</code> and friends to <code>WorldCell</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6249">Add a method for accessing the width of a <code>Table</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6242">Add iter_entities to World #6228</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6214">Adding Debug implementations for App, Stage, Schedule, Query, QueryState, etc.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6199">Add a method for mapping <code>Mut&lt;T&gt;</code> -&gt; <code>Mut&lt;U&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6123">implemented #[bundle(ignore)]</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6113">Allow access to non-send resource through <code>World::resource_scope</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5854">Add get_entity to Commands</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5838">Added the ability to get or set the last change tick of a system.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5776">Add a module for common system <code>chain</code>/<code>pipe</code> adapters</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5731">SystemParam for the name of the system you are currently in</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5730">Warning message for missing events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5635">Add a change detection bypass and manual control over change ticks</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5586">Add into_world_mut to EntityMut</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5481">Add <code>FromWorld</code> bound to <code>T</code> in <code>Local&lt;T&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5461">Add <code>From&lt;EntityMut&gt;</code> for EntityRef (fixes #5459)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5096">Implement IntoIterator for ECS wrapper types.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4109">add <code>Res::clone</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6470">Add CameraRenderGraph::set</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6318">Use wgsl saturate</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6268">Add mutating <code>toggle</code> method to <code>Visibility</code> component</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6222">Add globals struct to mesh2d</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6084">add support for .comp glsl shaders</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6025">Implement <code>IntoIterator</code> for <code>&amp;Extract&lt;P&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6009">add Debug, Copy, Clone derives to Circle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5991">Add TextureFormat::Rg16Unorm support for Image and derive Resource for SpecializedComputePipelines</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5566">Add <code>bevy_render::texture::ImageSettings</code> to prelude</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5557">Add <code>Projection</code> component to prelude.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5527">Expose <code>Image</code> conversion functions (fixes #5452)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6478">Macro for Loading Internal Binary Assets</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6337">Add <code>From&lt;String&gt;</code> for <code>AssetPath&lt;'a&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6274">Add Eq &amp; PartialEq to AssetPath</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5923">add <code>ReflectAsset</code> and <code>ReflectHandle</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5827">Add warning when using load_folder on web</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6374">Expose rodio's Source and Sample traits in bevy_audio</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6321">Add a way to toggle <code>AudioSink</code></a></li> +</ul> +<h3 id="changed">Changed +<a class="anchor-link" href="#changed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/3425">separate tonemapping and upscaling passes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6415">Rework ViewTarget to better support post processing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5723">bevy_reflect: Improve serialization format even more</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6140">bevy_reflect: Binary formats</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6411">Unique plugins</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6380">Support arbitrary RenderTarget texture formats</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5577">Make <code>Resource</code> trait opt-in, requiring <code>#[derive(Resource)]</code> V2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6319">Replace <code>WorldQueryGats</code> trait with actual gats</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6000">Change UI coordinate system to have origin at top left corner</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6533">Move the cursor's origin back to the bottom-left</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5877">Add z-index support with a predictable UI stack</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6443">TaskPool Panic Handling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2975">Implement <code>Bundle</code> for <code>Component</code>. Use <code>Bundle</code> tuples for insertion</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6054">Spawn now takes a Bundle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5205">make <code>WorldQuery</code> very flat</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6039">Accept Bundles for insert and remove. Deprecate insert/remove_bundle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6083">Exclusive Systems Now Implement <code>System</code>. Flexible Exclusive System Params</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6416">bevy_scene: Serialize entities to map</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6382">bevy_scene: Stabilize entity order in <code>DynamicSceneBuilder</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6354">bevy_scene: Replace root list with struct</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6345">bevy_scene: Use map for scene <code>components</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4919">Start running systems while prepare_systems is running</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4809">Extract Resources into their own dedicated storage</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5413">get proper texture format after the renderer is initialized, fix #3897</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6088">Add getters and setters for <code>InputAxis</code> and <code>ButtonSettings</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4800">Clean up Fetch code</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4466">Nested spawns on scope</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4724">Skip empty archetypes and tables when iterating over queries</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6066">Increase the <code>MAX_DIRECTIONAL_LIGHTS</code> from 1 to 10</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6543">bevy_pbr: Normalize skinned normals</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6127">remove mandatory mesh attributes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6350">Rename <code>play</code> to <code>start</code> and add new <code>play</code> method that won't overwrite the existing animation if it's already playing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6247">Replace the <code>bool</code> argument of <code>Timer</code> with <code>TimerMode</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5847">improve panic messages for add_system_to_stage and add_system_set_to_stage</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6194">Use default serde impls for Entity</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5994">scenes: simplify return type of iter_instance_entities</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5825">Consistently use <code>PI</code> to specify angles in examples.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6133">Remove <code>Transform::apply_non_uniform_scale</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6132">Rename <code>Transform::mul_vec3</code> to <code>transform_point</code> and improve docs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6487">make <code>register</code> on <code>TypeRegistry</code> idempotent</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6381">do not set cursor grab on window creation if not asked for</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6114">Make <code>raw_window_handle</code> field in <code>Window</code> and <code>ExtractedWindow</code> an <code>Option</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5878">Support monitor selection for all window modes.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5296"><code>Gamepad</code> type is <code>Copy</code>; do not require / return references to it in <code>Gamepads</code> API</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6398">Update tracing-chrome to 0.6.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5864">Update to ron 0.8</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6303">Update clap requirement from 3.2 to 4.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6427">Update glam 0.22, hexasphere 8.0, encase 0.4</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6218">Update <code>wgpu</code> to 0.14.0, <code>naga</code> to <code>0.10.0</code>, <code>winit</code> to 0.27.4, <code>raw-window-handle</code> to 0.5.0, <code>ndk</code> to 0.7</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5865">Update to notify 5.0 stable</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6020">Update rodio requirement from 0.15 to 0.16</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6100">remove copyless</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6068">Mark <code>Task</code> as <code>#[must_use]</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4970">Swap out num_cpus for std::thread::available_parallelism</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6473">Cleaning up NodeBundle, and some slight UI module re-organization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6211">Make the default background color of <code>NodeBundle</code> transparent</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6087">Rename <code>UiColor</code> to <code>BackgroundColor</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5554">changed diagnostics from seconds to milliseconds</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6461">Remove unnecesary branches/panics from Query accesses</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6452"><code>debug_checked_unwrap</code> should track its caller</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6400">Speed up <code>Query::get_many</code> and add benchmarks</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6230">Rename system chaining to system piping</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6107">[Fixes #6059] <code>Entity</code>'s “ID” should be named “index” instead</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6008"><code>Query</code> filter types must be <code>ReadOnlyWorldQuery</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5916">Remove ambiguity sets</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5917">relax <code>Sized</code> bounds around change detection types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5895">Remove ExactSizeIterator from QueryCombinationIter</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5871">Remove Sync bound from Command</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5688">Make most <code>Entity</code> methods <code>const</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5608">Remove <code>insert_resource_with_id</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5593">Avoid making <code>Fetch</code>s <code>Clone</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5483">Remove <code>Sync</code> bound from <code>Local</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5402">Replace <code>many_for_each_mut</code> with <code>iter_many_mut</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4452">bevy_ecs: Use 32-bit entity ID cursor on platforms without AtomicI64</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6459">Specialize UI pipeline on &quot;hdr-ness&quot;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6442">Allow passing <code>glam</code> vector types as vertex attributes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6392">Add multi draw indirect draw calls</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6384">Take DirectionalLight's GlobalTransform into account when calculating shadow map volume (not just direction)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6349">Respect mipmap_filter when create ImageDescriptor with linear()/nearest()</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6233">use bevy default texture format if the surface is not yet available</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6115">log pipeline cache errors earlier</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6057">Merge TextureAtlas::from_grid_with_padding into TextureAtlas::from_grid through option arguments</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6049">Reconfigure surface on present mode change</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5826">Use 3 bits of PipelineKey to store MSAA sample count</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5708">Limit FontAtlasSets</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5686">Move <code>sprite::Rect</code> into <code>bevy_math</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5685">Make vertex colors work without textures in bevy_sprite</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5601">use bevy_default() for texture format in post_processing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5537">don't render completely transparent UI nodes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4460">make TextLayoutInfo a Component</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6176">make <code>Handle::&lt;T&gt;</code> field id private, and replace with a getter</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5968">Remove <code>AssetServer::watch_for_changes()</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5321">Rename Handle::as_weak() to cast_weak()</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5819">Remove <code>Sync</code> requirement in <code>Decodable::Decoder</code></a></li> +</ul> +<h3 id="fixed">Fixed +<a class="anchor-link" href="#fixed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/5509">Optimize rendering slow-down at high entity counts</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6288">bevy_reflect: Fix <code>DynamicScene</code> not respecting component registrations during serialization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5751">fixes the types for Vec3 and Quat in scene example to remove WARN from the logs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6210">Fix end-of-animation index OOB</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5783">bevy_reflect: Remove unnecessary <code>Clone</code> bounds</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5780">bevy_reflect: Fix <code>apply</code> method for <code>Option&lt;T&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6329">Fix outdated and badly formatted docs for <code>WindowDescriptor::transparent</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5883">disable window pre creation for ios</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5863">Remove unnecessary unsafe <code>Send</code> and <code>Sync</code> impl for <code>WinitWindows</code> on wasm.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5582">Fix window centering when scale_factor is not 1.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5558">fix order of exit/close window systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4352">bevy_input: Fix process touch event</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6509">fix: explicitly specify required version of async-task</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6485">Fix <code>clippy::iter_with_drain</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6481">Use <code>cbrt()</code> instead of <code>powf(1./3.)</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6192">Fix <code>RemoveChildren</code> command</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6017">Fix inconsistent children removal behavior</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6121">tick local executor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6545">Fix panic when the primary window is closed</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6479">UI scaling fix</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6351">Fix clipping in UI</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6290">Fixes scroll example after inverting UI Y axis</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6273">Fixes incorrect glyph positioning for text2d</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5886">Clean up taffy nodes when UI node entities are removed</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6464">Fix unsound <code>EntityMut::remove_children</code>. Add <code>EntityMut::world_scope</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6425">Fix spawning empty bundles</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6401">Fix query.to_readonly().get_component_mut() soundness bug</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5835">#5817: derive_bundle macro is not hygienic</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5587">drop old value in <code>insert_resource_by_id</code> if exists</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5560">Fix lifetime bound on <code>From</code> impl for <code>NonSendMut</code> -&gt; <code>Mut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6439">Fix <code>mesh.wgsl</code> error for meshes without normals</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6460">Fix panic when using globals uniform in wasm builds</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6341">Resolve most remaining execution-order ambiguities</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6209">Call <code>mesh2d_tangent_local_to_world</code> with the right arguments</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6170">Fixes Camera not being serializable due to missing registrations in core functionality.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6167">fix spot dir nan bug</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/6047">use alpha mask even when unlit</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5957">Ignore <code>Timeout</code> errors on Linux AMD &amp; Intel</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5947">adjust cluster index for viewport origin</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5945">update camera projection if viewport changed</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5942">Ensure 2D phase items are sorted before batching</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5766">bevy_pbr: Fix incorrect and unnecessary normal-mapping code</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5757">Add explicit ordering between <code>update_frusta</code> and <code>camera_system</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5666">bevy_pbr: Fix tangent and normal normalization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5613">Fix shader syntax</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5546">Correctly use as_hsla_f32 in <code>Add&lt;Color&gt;</code> and <code>AddAssign&lt;Color&gt;</code>, fixes #5543</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5531">Sync up bevy_sprite and bevy_ui shader View struct</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5512">Fix View by adding missing fields present in ViewUniform</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3009">Freeing memory held by visible entities vector</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5729">Correctly parse labels with '#'</a></li> +</ul> + + + + Bevy's Second Birthday + 2022-08-10T00:00:00+00:00 + 2022-08-10T00:00:00+00:00 + + https://bevyengine.org/news/bevys-second-birthday/ + <p><a href="https://www.twitter.com/cart_cart">@cart</a> here (Bevy's creator, lead developer, and project manager) with another exciting announcement:</p> +<p>It has now been two years since the initial Bevy release! As is (now) tradition, I will take this as a chance to reflect on the past year and outline our plans for the future. If you're curious, check out <a href="/news/bevys-first-birthday">last year's birthday post</a>.</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. Bevy is also free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. We have a <a href="/learn/book/getting-started/">Quick Start Guide</a> and a <a href="/learn/book/introduction/">Bevy Book</a>. You can also check out <a href="/assets/">Bevy Assets</a> for a library of community-developed plugins, crates, games, and learning resources.</p> +<span id="continue-reading"></span><h2 id="a-year-of-milestones">A Year of Milestones +<a class="anchor-link" href="#a-year-of-milestones">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-second-birthday/milestones.svg" alt="milestones" /></p> +<ul> +<li><strong>January 1</strong>: Alice Cecile (@alice-i-cecile) gets scoped merge rights for documentation work.</li> +<li><strong>January 8</strong>: <a href="/news/bevy-0-6">Bevy 0.6</a> +<ul> +<li>We added a brand new modern renderer that is prettier, faster, and simpler to extend, directional and point light shadows, clustered forward rendering, frustum culling, significantly faster sprite rendering with less boilerplate, native WebGL2 support, high level custom Materials, more powerful shaders: preprocessors, imports, WGSL support, Bevy ECS ergonomics and performance improvements, no more .system(), and more!</li> +</ul> +</li> +<li><strong>January 8</strong>: Train Release Model +<ul> +<li>Bevy adopts a rough &quot;3 month train release model&quot;. We no longer hold releases back for specific features. Approximately every 3 months, we kick off the release process.</li> +</ul> +</li> +<li><strong>February 24</strong>: <a href="https://store.steampowered.com/app/1792170/Molecoole/">The first Bevy game is released on Steam: Molecoole</a></li> +<li><strong>February 25</strong>: <a href="https://itch.io/jam/bevy-jam-1">Bevy Jam #1</a> +<ul> +<li>The first official Bevy Jam! 431 people joined, 74 people submitted games, and people left 1,618 ratings. <a href="https://jabuwu.itch.io/petty-party">Petty Party</a> won!</li> +</ul> +</li> +<li><strong>April 10 (approximately)</strong> Bevy hits 15,000 stars on GitHub!</li> +<li><strong>April 15</strong>: <a href="/news/bevy-0-7">Bevy 0.7</a> +<ul> +<li>We added skeletal animation and mesh skinning, GLTF animation importing, unlimited* point lights in a scene, improved clustered forward rendering, +compressed texture support (KTX2 / DDS / .basis), compute shader / pipeline specialization, +render to texture, flexible mesh vertex layouts in shaders, ECS improvements: Order systems using their names, Query::many_mut, ParamSets, WorldQuery derives, documentation improvements: better examples, more doc tests and more coverage, more audio control: pause, volume, speed, and looping, power usage options, and more!</li> +</ul> +</li> +<li><strong>April 21</strong>: <a href="/news/bevy-0-8/#bevy-org-changes">New Project Role: Maintainer</a> +<ul> +<li>The &quot;maintainer&quot; role replaces our old &quot;delegated merge rights&quot; roles, providing more decision making power, removing explicit scope/area restrictions, while still preserving my ability to ensure consistent project direction when that is important.</li> +<li>Everyone with &quot;delegated / scoped merge rights&quot; is now a &quot;maintainer&quot; (@alice-i-cecile, @mockersf).</li> +</ul> +</li> +<li><strong>April 21</strong>: Rob Swain (@superdump) is made a maintainer.</li> +<li><strong>June 10 (approximately)</strong>: Bevy becomes the <a href="https://github.com/topics/game-engine">3rd most popular game engine on GitHub</a></li> +<li><strong>June 18</strong>: <a href="https://apps.apple.com/us/app/noumenal/id1584884105">The first Bevy iOS app is published to the Apple App Store: Noumenal</a></li> +<li><strong>July 30</strong>: <a href="/news/bevy-0-8">Bevy 0.8</a> +<ul> +<li>We added a new Material system / simpler custom shaders / AsBindGroup derives, camera-driven rendering (simple split screen, portals, render to texture, renderer layering, etc), built-in shader modularization (importable built in shader types and functions, custom shaders can now import the PBR shader logic), spotlights, visibility inheritance, automatic mesh tangent generation, renderer optimizations: parallel frustum culling and unstable sorts for unbatched render phases, scene bundle, scripting / modding progress via untyped ECS APIs, ECS query ergonomics and usability, ECS internals refactors/cleanups, reflection improvements: support for reflecting more types, ECS resource reflection, untyped reflection, improved reflection internals, transactional hierarchy commands, <a href="https://github.com/DioxusLabs/taffy"><code>taffy</code></a> layout, and more!</li> +</ul> +</li> +<li><strong>August 10</strong>: Bevy is now two years old!</li> +</ul> +<h2 id="a-year-by-the-numbers">A Year By The Numbers +<a class="anchor-link" href="#a-year-by-the-numbers">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-second-birthday/numbers.svg" alt="numbers" /></p> +<ul> +<li><strong>470</strong> unique Bevy contributors on <a href="https://github.com/bevyengine">GitHub</a> (up from 255)</li> +<li><strong>17,830</strong> <a href="https://github.com/bevyengine">GitHub</a> stars (up from 10,030)</li> +<li><strong>1,693</strong> forks on <a href="https://github.com/bevyengine">GitHub</a> (up from 837)</li> +<li><strong>3,610</strong> pull requests (2354 merged) on <a href="https://github.com/bevyengine">GitHub</a> (up from 1,501 prs and 1060 merged)</li> +<li><strong>2,228</strong> issues (1,303 closed) on <a href="https://github.com/bevyengine">GitHub</a> (up from 1,112)</li> +<li><strong>3,629</strong> commits on <a href="https://github.com/bevyengine">GitHub</a> (up from 1,895)</li> +<li><strong>470</strong> <a href="https://github.com/bevyengine/bevy/discussions">GitHub Discussions</a> (up from 153)</li> +<li><strong>191</strong> <a href="/assets/">Bevy Assets</a> (plugins, crates, games, apps, and learning materials) (up from 110)</li> +<li><strong>206,328</strong> downloads on <a href="https://crates.io/crates/bevy">crates.io</a> (up from 57,349)</li> +<li><strong>382</strong> <a href="https://twitter.com/BevyEngine">@BevyEngine</a> retweets of Bevy community content on Twitter (up from 93)</li> +<li><strong>9,686</strong> <a href="https://discord.com/invite/bevy">Bevy Discord</a> members (up from 4,871)</li> +<li><strong>1,789</strong> community #showcase entries in the <a href="https://discord.com/invite/bevy">Bevy Discord</a> (up from 771)</li> +<li><strong>968,290</strong> messages in the <a href="https://discord.com/invite/bevy">Bevy Discord</a> (up from 420,250)</li> +</ul> +<p>Note that for consistency and clarity all of these numbers are given in &quot;absolute totals&quot;, as that is how they are generally reported. For example, we now have 17,830 <em>total</em> GitHub stars ... the number you will see in our repo. I've included the totals as reported last year as well, which can be used to calculate the change in the numbers since last year.</p> +<h2 id="things-i-m-proud-of">Things I'm Proud Of +<a class="anchor-link" href="#things-i-m-proud-of">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-second-birthday/proud.svg" alt="proud" /></p> +<p>I'll try not to repeat myself here, but note that I am still extremely proud of the <a href="/news/bevys-first-birthday">things I outlined in last year's retrospective</a>.</p> +<h3 id="the-new-bevy-renderer">The New Bevy Renderer +<a class="anchor-link" href="#the-new-bevy-renderer">#</a> +</h3> +<p>Last year we <em>heavily</em> invested in Bevy's renderer. At the start of the year, we <a href="/news/bevy-0-6/#the-new-bevy-renderer">built a new renderer from scratch</a>. From that foundation we continued to iterate with success. Bevy's renderer is now:</p> +<ol> +<li><strong>Faster</strong>: frustum culling, clustered forward rendering, sprite batching, more &quot;internal&quot; parallelism, lower render costs per entity, parallel pipelining (to be enabled soon ... I'll cover this in a bit)</li> +<li><strong>Easier to Understand</strong>: clearer layers of abstraction and dataflow (low: raw wgpu, mid: Render Graph, Extract/Prepare/Queue, PipelineCache, ShaderType, high: Material, Meshes)</li> +<li><strong>Easier to Extend</strong>: new high level Material system for simple custom shaders, camera driven rendering / per camera render graphs, flexible mesh vertex layouts, shader imports, modularized / extensible shader logic (such as our PBR logic), better Rust-&gt;GPU dataflow via ShaderType</li> +<li><strong>More Featureful</strong>: More lighting options (point / directional / spot / spherical), shadows, shader imports and preprocessing, compute shaders, skeletal animation, camera driven rendering (render to texture, split screen, portals, etc), unlimited* point lights, compressed gpu textures, visibility inheritance, mesh tangent generation, better pipeline specialization, etc</li> +</ol> +<p>We've invested a lot in making the renderer modular and extensible. That plus a clearer / more principled architecture has resulted in a serious uptick in renderer feature development, both upstream and in the wider ecosystem. Community projects like <a href="https://github.com/cryscan/bevy-hikari">bevy_hikari</a>, <a href="https://www.youtube.com/c/chrisbiscardi">Chris Biscardi's Bevy shader videos on YouTube</a>, and the increasingly pretty content in the <a href="https://discord.gg/bevy"><code>#showcase</code> channel on Bevy's Discord</a> make it feel like we're on the right track here. People are more willing and able to write Bevy renderer code than they were with the previous renderer (including our core contributors).</p> +<p>There is still plenty of work to do, but I think we've largely laid the foundations at this point. Now we can now focus on features, performance, and improving the user experience.</p> +<h3 id="delegation-and-project-scaling">Delegation and Project Scaling +<a class="anchor-link" href="#delegation-and-project-scaling">#</a> +</h3> +<p>Last year I struggled a lot with <a href="/news/bevys-first-birthday/#delegating-work-and-responsibility">scaling the project</a> to account for a rapidly growing community, managing burnout, maintaining control, etc.</p> +<p>I'm happy to say that while we haven't <em>solved</em> this problem, we're in a much better spot than we were before! We've defined a new <a href="/news/bevy-0-8/#bevy-org-changes">&quot;maintainer&quot; role</a> and filled it with capable people (@mockersf, @alice-i-cecile, @superdump). Maintainers have more freedom to merge code and make decisions, but we've also defined a &quot;controversial change&quot; process that allows me to dictate project direction when that is necessary (ex: ensuring consistent vision, resolving disputes, quality control, etc).</p> +<p><a href="https://github.com/sponsors/alice-i-cecile">Alice Cecile</a> (@alice-i-cecile) has been working full time and has done a great job wrangling issues, merging uncontroversial PRs expediently, picking up areas like documentation, working on the ECS, and directing contributor energy in the right direction. This eased my burden significantly and enabled me to focus my energy in areas that need it the most (making core architectural decisions and building out core features, reviewing controversial / technical changes, managing the project, etc). They recently <a href="https://rustconf.com/schedule#your-open-source-repo-needs-a-project-manager">gave a fantastic talk about project management at Rust Conf</a>!</p> +<p><a href="https://github.com/sponsors/mockersf">François Mockers</a> (@mockersf) has proven to be a technically proficient jack of all trades that has focused on making our CI top-tier, fixing critical issues before anyone else is even aware of them, and picking up high value work that is sometimes (regrettably) lower visibility. On top of that, they have demonstrated skill and interest in pretty much every pillar of the engine.</p> +<p>Rob Swain (@superdump) (our newest maintainer) has designed and implemented a huge portion of the pretty renderer features (lighting, shadows, clustered forward rendering, etc) and has clearly established themselves as a technical leader in that area. Bevy's renderer would not be what it is today without their dedication and expertise.</p> +<h3 id="a-thriving-ecosystem">A Thriving Ecosystem +<a class="anchor-link" href="#a-thriving-ecosystem">#</a> +</h3> +<p>Being a young engine, Bevy still has a number of functionality gaps. But thanks to our focus on modularity, many of these gaps have already been filled by the community!</p> +<p>This is great because Bevy app developers are unblocked in these areas. The community gets to experiment with and iterate on ideas. And we (as Bevy engine developers) get to observe these spaces, learn what patterns work, and ultimately either adopt them or iterate on them when the time comes.</p> +<p>In particular, the following Bevy plugins are particularly popular and useful:</p> +<ul> +<li><strong>Physics</strong>: <a href="https://github.com/dimforge/bevy_rapier">bevy_rapier</a> (the official <a href="https://rapier.rs/">Rapier</a> plugin maintained by the Rapier developers) is by far the best option if you need physics in your Bevy App. We will likely upstream some form of Rapier integration this year.</li> +<li><strong>UI</strong>: Bevy UI is still in the early stages of development. It is useful for basic game UIs (like health bars / huds / etc), but it isn't quite ready for more complicated UI-heavy scenarios. In these cases, <a href="https://github.com/mvlabat/bevy_egui">bevy_egui</a> provides a fully featured immediate-mode GUI solution that plays very nicely with Bevy ECS.</li> +<li><strong>Audio</strong>: Bevy's audio system is also still bare bones. For more flexible audio control, <a href="https://github.com/NiklasEi/bevy_kira_audio">bevy_kira_audio</a> has your back.</li> +<li><strong>Editor</strong>: Bevy doesn't yet have an official visual editor. <a href="https://github.com/jakobhellermann/bevy_editor_pls">bevy_editor_pls</a> is a 3rd party Bevy Plugin that adds editor functionality to your game. Still a work in progress, but very useful!</li> +<li><strong>Networking</strong>: Game networking is a pretty opinionated space, so it is unsurprising that there are a lot of options here! <a href="https://crates.io/crates/bevy_ggrs">bevy_ggrs</a>, <a href="https://crates.io/crates/bevy_renet">bevy_renet</a>, <a href="https://crates.io/crates/bevy_backroll">bevy_backroll</a>, and <a href="https://github.com/naia-lib/naia/tree/main/demos/bevy">naia</a> are some of the most popular choices.</li> +</ul> +<p>There are <em>tons</em> of other plugins listed on <a href="/assets/#assets">Bevy Assets</a>.</p> +<p>Thanks to our first <a href="https://itch.io/jam/bevy-jam-1">Bevy Jam</a>, games listed on <a href="/assets/#games">Bevy Assets</a>, and the many <a href="https://itch.io/games/tag-bevy">Bevy games listed on itch.io</a>, we now have hundreds of examples of Bevy games, many of which are open source.</p> +<p>While we wait for the new Bevy Book, <a href="https://bevy-cheatbook.github.io/">Bevy Cheatbook</a> continues to be a top tier community developed learning resource.</p> +<p>We've also seen an uptick in educational Bevy content on YouTube. <a href="https://www.youtube.com/c/Tantandev">Tantan</a>, <a href="https://www.youtube.com/channel/UC7v3YEDa603x_84PgCPytzA">Logic Projects</a>, <a href="https://www.youtube.com/c/chrisbiscardi">Chris Biscardi</a>, <a href="https://www.youtube.com/c/PhaestusFox">PhaestusFox</a>, <a href="https://www.youtube.com/c/JeremyChone">Jeremy Chone</a>, <a href="https://www.youtube.com/channel/UCwTl4_-_pAaloW07Q2o-tSw">Griffin</a>, and others have been creating some really interesting stuff.</p> +<p>As I recently <a href="https://twitter.com/cart_cart/status/1547699794092498945">ranted on Twitter</a>, developer ecosystems are what really drive the success of an engine. And in my opinion the Bevy developer community is the <em>primary</em> driver of our success.</p> +<h3 id="people-and-companies-are-using-bevy-for-real-projectstm">People and Companies Are Using Bevy for Real Projects™ +<a class="anchor-link" href="#people-and-companies-are-using-bevy-for-real-projectstm">#</a> +</h3> +<p><a href="https://www.foresightmining.com/">Foresight</a>, <a href="https://noumenal.app/">Noumenal</a>, <a href="https://store.steampowered.com/app/1792170/Molecoole/">Molecoole</a>, and <a href="https://github.com/fishfolks/punchy">Punchy / Fish Folk</a> are some notable examples of projects that involve people that are getting paid for their work using Bevy. We've had 16 Bevy-related job postings on <a href="https://discord.gg/bevy">our Discord</a>!</p> +<p>I find it interesting that some of the most notable Bevy projects are tools / non-games (Foresight and Noumenal). It seems like the modularity of the engine makes us a compelling choice for tooling that requires a renderer and a principled app model.</p> +<p>Of course, my &quot;Bevy is still young and we make breaking changes regularly&quot; warning still applies. Before picking us for a serious project: do your research, experiment with Bevy, and get a feel for what Bevy development looks like <em>today</em>. But I think given the progression we're seeing here, I might need to consider changing or removing that warning sooner than I thought. More and more projects are choosing Bevy and reporting positive experiences.</p> +<h2 id="there-is-always-room-for-improvement">There Is Always Room For Improvement +<a class="anchor-link" href="#there-is-always-room-for-improvement">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-second-birthday/improve.svg" alt="improve" /></p> +<h3 id="bevy-0-6-took-too-long">Bevy 0.6 Took Too long +<a class="anchor-link" href="#bevy-0-6-took-too-long">#</a> +</h3> +<p>I chose to hold back <strong>Bevy 0.6</strong> until the new renderer was in a good spot, which in retrospect was a mistake. No sense in preventing people from using features that are ready just because another unrelated feature isn't ready! This was generally bad for morale and a large gap in public Bevy announcements was also suboptimal. In response to that drawn out release, we adopted a &quot;train release schedule&quot;, which protected us from large, drawn out releases blocking on specific features. <a href="/news/bevy-0-7">Bevy 0.7</a> and <a href="/news/bevy-0-8">Bevy 0.8</a> used the new model and it resulted in faster, lower stress, and more predictable releases. We're still refining the process, but so far from what I can tell both Bevy developers and Bevy users are liking the new system.</p> +<h3 id="pipelined-rendering-isn-t-actually-pipelined-yet">Pipelined Rendering Isn't Actually Pipelined Yet +<a class="anchor-link" href="#pipelined-rendering-isn-t-actually-pipelined-yet">#</a> +</h3> +<p>For <strong>Bevy 0.6</strong> we went through a lot of trouble to design and implement a renderer that supports parallel pipelining. The entire design philosophy revolves around that, such as the &quot;extract&quot; pattern for reading data from the &quot;main app&quot; to the &quot;render app&quot;. However in the interest of getting <strong>Bevy 0.6</strong> out the door ASAP, we made the call to hold off on enabling pipelining. There were some unanswered questions about how to handle threading in a way that accommodates edge cases like &quot;non send&quot; resources. I've had a <a href="https://github.com/cart/bevy/tree/actual-pipelining">branch that enables parallel pipelining</a> since before <strong>Bevy 0.6</strong> dropped.</p> +<p>I continually deprioritized the last-mile effort required to enable pipelining in favor of building out other renderer features and unblocking other engine efforts. In some cases, I think this was the right call. User experience is generally way more important than eking out more performance. But letting these gains sit unrealized for about 8 months is regrettable, especially given how close we are and how much we've already invested. I will be prioritizing this last mile work.</p> +<h3 id="we-need-the-bevy-editor-now">We Need The Bevy Editor Now! +<a class="anchor-link" href="#we-need-the-bevy-editor-now">#</a> +</h3> +<p>Modern gamedev workflows for most game types require visual editors. Being able to visually and interactively move entities around in a scene is critical if you are building visual, interactive experiences. Bevy has a scene system, but without visual tooling it is hard to get any value out of it. Because of this, Bevy Engine developers don't have serious incentives or feedback loops to expand and improve the scene system, and Bevy users don't have serious incentives to adopt it.</p> +<p>I've been deliberately holding back Bevy Editor development since Bevy first released so that we can build out Bevy's core systems in a focused way. I've been saying we need Bevy UI to be &quot;editor ready&quot; (aka ensuring it has the required features, widgets, patterns, and UX sorted out) before we start building out editor experiences. I no longer believe that. I think we should take a more iterative approach. Unlock the value now. Learn from experience. Refine. Iterate. Repeat. As Bevy UI evolves, we will need to rewrite aspects of the editor. Yes this is retreading ground, but I now believe it is Worth It.</p> +<h3 id="the-rise-and-fall-of-bevy-merch">The Rise And Fall of Bevy Merch +<a class="anchor-link" href="#the-rise-and-fall-of-bevy-merch">#</a> +</h3> +<p>Many of you may have noticed that <a href="https://twitter.com/BevyEngine/status/1498026079738421248">we announced the Bevy Merch store</a> in February. There is a lot of demand for Bevy apparel / stickers / etc and we wanted to provide that option. Many people bought Bevy Merch and for awhile, life was good.</p> +<p>Sadly as the months progressed, <a href="https://twitter.com/cart_cart/status/1525984877773877248">I noticed that the print on my Bevy sweater started peeling after 3 washes</a>. One other Bevy community member reached out and reported the same thing. Rather than sitting around and waiting for more issues to pop up, I opted to <a href="https://twitter.com/BevyEngine/status/1525983991391612930">close Bevy Merch</a> in May and offered everyone refunds out of my own pocket.</p> +<p>If anyone is looking for an apparel / printing service, please steer clear of Spring (our old merch provider). Their print quality and longevity is <em>poor</em>.</p> +<p>We will almost certainly find another merch provider and re-open the store, but before opening our doors to the public I will do thorough quality testing over a long period of time. The Bevy community put their trust in me and I put my trust in Spring (which they did not earn and promptly lost). When your money is involved you all deserve more thoroughness than I gave you. I am sincerely sorry. I won't make the same mistake again.</p> +<h2 id="did-we-learn-from-last-year">Did We Learn From Last Year? +<a class="anchor-link" href="#did-we-learn-from-last-year">#</a> +</h2> +<p>It is important for organizations to learn from their mistakes. Now that we have a year in our &quot;birthday buffer&quot;, its worth looking back to see how we did. Here is my list of &quot;improvement areas&quot; from <a href="/news/bevys-first-birthday/#there-is-always-room-for-improvement">last year's birthday post</a>, followed by how I think we handled them this year:</p> +<ul> +<li><strong>Delegating Work and Responsibility / Issue and Pull Response Times</strong>: As mentioned in the &quot;Things I'm Proud Of&quot; section, we made significant strides this year. But this is a battle we will be fighting for as long as Bevy continues to grow.</li> +<li><strong>Project Planning and Communicating Project Direction</strong>: This year we retired the old &quot;focus areas&quot; model in favor of a more organic approach. We have heavily embraced <a href="https://github.com/orgs/bevyengine/projects?type=new">domain-specific project boards</a>, which helps people follow along with what we are working on. This is an improvement over the old <em>perpetually and actively wrong</em> focus areas. And the direct ties to our GitHub issues and pull requests anchors these things in reality. That being said, I think there is still a gap when it comes to communicating our big / high level priorities in an easy-to-digest manner.</li> +<li><strong>The Old Renderer's Mid Level APIs</strong>: We scrapped the old renderer entirely! I won't repeat what I said in the &quot;Things I'm Proud Of&quot; section, but I consider this largely resolved. On the topic of &quot;understandability&quot;, I think our biggest gap at this point is documentation and learning paths.</li> +<li><strong>Filling Niches</strong>: Last year, I wanted us to focus on making Bevy a competitive experience for specific classes of apps. For our first year we went &quot;wide&quot; to cover as many domains as possible (2d, 3d, ui, etc) but within a given domain, there were gaps everywhere. We've definitely improved a lot here. 3D now has key features like skeletal animation, which was blocking pretty much every serious 3D game from being produced. Thanks to the new renderer and sprite batching our core 2D performance is in a much better spot and sprite-heavy games are now possible. That being said, in spirit, I don't think we've checked this box. When it comes to features, Bevy still isn't remotely competitive with the other big players in the space. That is certainly not a gap we can close in a year of time, but this year we <em>really</em> need to start focusing more on asset workflows, scenes, and editor experiences.</li> +<li><strong>I'm Not Drawing Enough Birds</strong>: For the first year of Bevy development, I offered a &quot;custom Bevy bird avatar&quot; reward tier for my sponsors. I was neglectfully slow when it came to drawing those birds. I'm happy to say that I successfully cleared my &quot;custom Bevy bird avatar&quot; backlog. Then I promptly removed that reward tier. It was fun, but my time is better spent building and managing Bevy.</li> +</ul> +<h2 id="can-cart-predict-the-future">Can @cart Predict The Future? +<a class="anchor-link" href="#can-cart-predict-the-future">#</a> +</h2> +<p>For our last birthday, I <a href="/news/bevys-first-birthday/#the-next-year-of-bevy">made some predictions for the next year</a>. Lets see how well I did :)</p> +<ul> +<li><strong>Bevy 0.6 will be released in the near future</strong>: We did indeed <a href="/news/bevy-0-6">release Bevy 0.6</a>, but as mentioned above, it took another 4 months. That is a stretch of the phrase &quot;near future&quot;.</li> +<li><strong>Asset Pipeline Maturity</strong>: The asset pipeline did not get asset pre-processing, import configuration, or better dependency management. This area <em>is</em> my primary focus for the next release cycle, but it was deprioritized last year. However we have done a lot of <a href="https://github.com/bevyengine/bevy/discussions/3972">design work and experimentation</a> in preparation for this.</li> +<li><strong>Next Generation Bevy UI</strong>: We did not meaningfully rework Bevy UI to improve the user experience or capabilities (other than swapping out the <a href="https://github.com/vislyhq/stretch"><code>stretch</code></a> layout lib for <a href="https://github.com/DioxusLabs/taffy"><code>taffy</code></a>, which fixed the <em>extremely poor</em> nested layout performance). Since <strong>Bevy 0.8</strong> dropped, we have started ramping up our efforts here and consolidating our plans to make Bevy UI excellent. But third party UI plugins like <a href="https://github.com/mvlabat/bevy_egui">bevy_egui</a> currently still provide a more pleasant and featureful experience.</li> +<li><strong>Break Ground on The Bevy Editor</strong>: We did not break ground on the Bevy Editor. As mentioned above, we <em>need</em> to start prioritizing this work.</li> +<li><strong>Predicted Scene Improvements</strong>: We did not get support for nested scenes, make the scene format prettier, or add property overloading. We have a new PR for a <a href="https://github.com/bevyengine/bevy/pull/4561">prettier scene format</a> that builds on all of the Bevy Reflect work we did last year, but we are still reviewing it.</li> +<li><strong>The New Bevy Book</strong>: We did make progress on the new Bevy Book, but we have not released it yet.</li> +<li><strong>Predicted Bevy ECS Features</strong>: We invested heavily in Bevy ECS, but we did not get &quot;reactive ECS&quot; / entity-relationship indexing. The parallel system scheduling API <em>was</em> improved, but we did not make it more granular (ex: &quot;stageless ECS&quot; is nearly ready, but we haven't merged it yet).</li> +<li><strong>Unified Property Animation System</strong>: We did do some design work (<a href="https://github.com/bevyengine/rfcs/pull/49">RFC 49</a>, <a href="https://github.com/bevyengine/rfcs/pull/51">RFC 51</a>) and there were some proposed implementations (<a href="https://github.com/bevyengine/bevy/pull/1429">PR 1429</a>), but we have not merged an implementation yet.</li> +<li><strong>Predicted 2D Features</strong>: We did implement sprite batching and sprite render layers! We didn't meaningfully add tileset workflow improvements (3rd party crates like <a href="https://github.com/StarArawn/bevy_ecs_tilemap">bevy_ecs_tilemap</a> are often still preferable). And we also didn't add visual editor workflows (because the Bevy Editor doesn't exist yet).</li> +<li><strong>Predicted 3D Features</strong>: We did implement skeletal animation, configurable / flexible / good looking shadows, and added a few more PBR Material configuration options! We did not add a global illumination implementation (although 3rd party plugins like <a href="https://github.com/cryscan/bevy-hikari">bevy-hikari</a> now exist). We also didn't add visual editor workflows (again, because the Bevy Editor doesn't exist yet).</li> +<li><strong>First Bevy Game Jam</strong>: We did indeed <a href="https://itch.io/jam/bevy-jam-1">have our first Bevy Jam</a>!</li> +</ul> +<p>As you can see, I largely failed to predict the future. Many of my predictions were in the vein of &quot;higher level asset and editor driven workflows&quot;, but we ended up focusing on other pillars like the Bevy Renderer, Bevy ECS, Bevy Reflect, and platform support (mainly Web, some iOS and Android).</p> +<p>I think we made the right calls here: we had a lot of foundational work to do, especially on the rendering front. Now that we've largely fleshed out Bevy's core (and code driven workflows), we can spend the next year realizing our plans for higher level editor driven workflows. Note that while our focus is shifting in this direction, we still plan to make code-first workflows first class and pleasant!</p> +<h2 id="the-next-year-of-bevy">The Next Year of Bevy +<a class="anchor-link" href="#the-next-year-of-bevy">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-second-birthday/next_year.svg" alt="next year" /></p> +<p>Here are some of our &quot;big ticket&quot; items planned for the next year. I'm keeping this list smaller and more scoped than last year because some of these items are <em>huge</em> efforts and I was clearly overconfident in my predictions last year. That being said, I think we now have a better understanding of where we are in our &quot;tech tree&quot;, we've started scaling out the Bevy Org and delegating effectively, and we are more capable of prioritizing these things (instead of needing to direct efforts to other foundational pieces). I believe we will make all of these things happen.</p> +<ul> +<li><strong>The Bevy Editor</strong>: This year, we will start experimenting in the &quot;visual scene editing&quot; space. By the end of the year, I would like to have basic scene editing workflows proved out in a &quot;minimum viable product&quot; fashion.</li> +<li><strong>Bevy Assets</strong>: We will add asset preprocessing (optimizing and processing assets at development time, such as precompiling shaders), which is a critical piece of modern gamedev. This will enable faster asset loading, smaller CPU and GPU memory footprints, per-asset import configuration stored in the filesystem, and smaller deployed app sizes.</li> +<li><strong>Bevy UI</strong>: Right now we have a reasonable DOM-like core. This year, we will flesh out what it means to define Bevy UI widgets, improve the ergonomics of defining UI trees, sort out hierarchical UI event handling, and explore higher level dataflow (such as &quot;reactivity&quot;). This will be developed in parallel with the Bevy Editor, which will dogfood Bevy UI and prove out patterns.</li> +<li><strong>Bevy Scenes</strong>: Scenes will get a prettier format, support scene nesting, and scene property overloading. These features will be developed in parallel with the Bevy Editor to ensure the experience is cohesive and pleasant.</li> +<li><strong>Bevy ECS</strong>: We will merge &quot;stageless&quot; ECS, making it easier / clearer for systems to depend on changes from other systems and resolving some of the biggest remaining UX issues in Bevy ECS.</li> +<li><strong>The New Bevy Book</strong>: We will replace the current Bevy Book with the New Bevy Book. This will be an iterative process. I care more about opening the doors to community Bevy Book development and building that into our developer culture than achieving specific milestones here. We've put this off for too long.</li> +</ul> +<p>We have <a href="https://github.com/bevyengine/bevy/pulls">plenty of other work in the pipeline</a>, but I'm keeping this scoped to highlight the areas I believe we should be focusing on (and where I will personally be directing my own efforts as the project lead).</p> +<p><a href="https://itch.io/jam/bevy-jam-2">Bevy Jam #2</a> is also coming up on August 19th. Game jams are a great way to dive in to game development, even if you have never built a game (or used Bevy)! They are also a great way to meet like minded people. I <em>highly</em> recommend participating. I personally had a blast during the <a href="https://itch.io/jam/bevy-jam-1">last one</a>!</p> +<p>If any of this excites you, we would love your help! Check out our code on <a href="https://github.com/bevyengine/bevy">GitHub</a>, start participating in the <a href="/community/">Bevy Community</a>, and consider <a href="/news/bevy-0-8/#support-bevy">sponsoring our work</a> to ensure we can continue building and leading this wildly ambitious project.</p> +<p>This year is going to be a big one for Bevy. I'm looking forward to spending it with you all!</p> +<p>- <a href="https://github.com/cart/">@cart</a></p> +<img src="/assets/bevy_logo_dark.svg" style="height: 4.0rem; margin-top: 1.5rem" /> + + + + Bevy 0.8 + 2022-07-30T00:00:00+00:00 + 2022-07-30T00:00:00+00:00 + + https://bevyengine.org/news/bevy-0-8/ + <p>Thanks to <strong>130</strong> contributors, <strong>461</strong> pull requests, community reviewers, and our <a href="https://github.com/sponsors/cart"><strong>generous sponsors</strong></a>, I'm happy to announce the <strong>Bevy 0.8</strong> release on <a href="https://crates.io/crates/bevy">crates.io</a>!</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out our <a href="/learn/book/getting-started/">Quick Start Guide</a> to try it today. It's free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. Check out <a href="https://bevyengine.org/assets">Bevy Assets</a> for a collection of community-developed plugins, games, and learning resources.</p> +<p>To update an existing Bevy App or Plugin to <strong>Bevy 0.8</strong>, check out our <a href="/learn/migration-guides/0.7-0.8/">0.7 to 0.8 Migration Guide</a>.</p> +<p>Since our last release a few months ago we've added a <em>ton</em> of new features, bug fixes, and quality of life tweaks, but here are some of the highlights:</p> +<ul> +<li><strong>New Material System</strong>: Custom shaders are now <em>much</em> easier to define, thanks to the new Material trait and AsBindGroup derive.</li> +<li><strong>Camera-driven Rendering</strong>: Each Camera now configures what it renders and how it renders it. Easily layer camera renders on top of each other, do split screen, or render to a texture in just a few lines of code.</li> +<li><strong>Built-in Shader Modularization</strong>: Many built-in shader types and functions are now importable. Notably, custom shaders can now import the PBR shader logic</li> +<li><strong>Spot Lights</strong>: A new light type that emits light in a cone shape from a fixed point.</li> +<li><strong>Visibility Inheritance</strong>: Hiding an entity now also hides all of its descendants in the hierarchy.</li> +<li><strong>Upgraded to wgpu 0.13</strong>: Uses a new, more ergonomic WGSL shader syntax.</li> +<li><strong>Automatic Mesh Tangent Generation</strong>: If tangents are missing for a mesh, generate them with mikktspace.</li> +<li><strong>Renderer Optimizations</strong>: Parallel frustum culling and unstable sorts for unbatched render phases yielded some big wins!</li> +<li><strong>Scene Bundle</strong>: Easily spawn scenes using a normal Bevy bundle and extend them with new components and children.</li> +<li><strong>Scripting and Modding Progress: Untyped ECS APIs</strong>: A step toward 3rd party scripting language support! Interact with Bevy ECS internals directly via pointers.</li> +<li><strong>ECS Query Ergonomics and Usability</strong>: Queries now implement <code>IntoIter</code> and mutable queries can be converted to immutable queries.</li> +<li><strong>ECS Internals Refactors</strong>: Sweeping changes to Bevy ECS internals that make it simpler, safer, and easier to maintain.</li> +<li><strong>Reflection Improvements</strong>: Support for reflecting more types, ECS resource reflection, untyped reflection, improved internals.</li> +<li><strong>Hierarchy Commands</strong>: Hierarchy updates now use &quot;transactional commands&quot; to ensure hierarchy consistency at all times.</li> +<li><strong>Bevy UI Now Uses Taffy</strong>: We've swapped to (and help maintain) a collaborative fork of the now abandoned Stretch UI layout library. Exponential blow-up bug begone!</li> +</ul> +<span id="continue-reading"></span><h2 id="new-material-system">New Material System +<a class="anchor-link" href="#new-material-system">#</a> +</h2> +<div class="release-feature-authors">authors: @cart, @Wrapperup, @johanhelsing</div> +<p>Bevy has a brand new <a href="https://docs.rs/bevy/0.8.0/bevy/pbr/trait.Material.html"><code>Material</code></a> system that makes defining custom shaders a breeze. Bevy's previous material system required hundreds of lines of &quot;mid-level&quot; boilerplate. This was never the long term plan, just an intermediate step. In <strong>Bevy 0.8</strong>, custom shader materials are as simple as this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">AsBindGroup<span class="z-punctuation z-separator z-rust">,</span> TypeUuid<span class="z-punctuation z-separator z-rust">,</span> Clone</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">uuid</span> <span class="z-keyword z-operator z-rust">=</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>f690fdae-d598-45ab-8225-97e2a3f056e0<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">CoolMaterial</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">uniform</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">0</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-variable z-other z-member z-rust">color</span><span class="z-punctuation z-separator z-type z-rust">:</span> Color, + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">texture</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">1</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">sampler</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">2</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-variable z-other z-member z-rust">color_texture</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Image<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The Material trait has many optional functions for configuration. +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> In this case, all we need to set is a fragment shader. Ergonomics! +</span><span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">Material <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">CoolMaterial</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">fragment_shader</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> ShaderRef</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>cool_material.wgsl<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>And the <code>cool_material.wgsl</code> shader:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">CoolMaterial</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">color</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">group</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">binding</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +<span class="z-meta z-generic z-rust">var<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>uniform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> material<span class="z-punctuation z-separator z-rust">:</span> CoolMaterial<span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">group</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">binding</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +var color_texture<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">texture_2d<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">group</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">binding</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">2</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +var color_sampler<span class="z-punctuation z-separator z-rust">:</span> sampler<span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-keyword z-operator z-rust">@</span>fragment +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">fragment</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + #import <span class="z-meta z-path z-rust">bevy_pbr<span class="z-punctuation z-accessor z-rust">::</span></span>mesh_vertex_output +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> </span></span><span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">location</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">return</span> material<span class="z-punctuation z-accessor z-dot z-rust">.</span>color <span class="z-keyword z-operator z-arithmetic z-rust">*</span> textureSample<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>color_texture<span class="z-punctuation z-separator z-rust">,</span> color_sampler<span class="z-punctuation z-separator z-rust">,</span> uv</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>And just like that, we have a configurable shader material!</p> +<p>This can be used to create whatever effects you want! For example: <code>@DGriffin91</code> made this cool &quot;glowing orb&quot; effect:</p> +<p><video controls loop><source src="marbles.mp4" type="video/mp4"/></video></p> +<p>They also made a <a href="https://www.youtube.com/watch?v=O6A_nVmpvhc">nice video tutorial</a> outlining how to create this material.</p> +<p>This is thanks to the new <a href="https://docs.rs/bevy/0.8.0/bevy/render/render_resource/trait.AsBindGroup.html"><code>AsBindGroup</code></a> trait / derive, which does all of the hard work of converting the material to GPU-compatible datatypes, writing them to the GPU, and creating the final <a href="https://docs.rs/bevy/0.8.0/bevy/render/render_resource/struct.BindGroup.html"><code>BindGroup</code></a>. The <a href="https://docs.rs/bevy/0.8.0/bevy/render/render_resource/trait.AsBindGroup.html"><code>AsBindGroup</code></a> trait is powerful: it supports combining multiple fields into the same uniform binding, configuring texture binding types (2D, 3D, filtering, etc), and more. For details, check out the <a href="https://docs.rs/bevy/0.8.0/bevy/render/render_resource/trait.AsBindGroup.html"><code>AsBindGroup</code></a> docs.</p> +<p>All built-in materials, such as the PBR <a href="https://docs.rs/bevy/0.8.0/bevy/pbr/struct.StandardMaterial.html"><code>StandardMaterial</code></a> have been ported to use this new system. We strive to make Bevy &quot;internals&quot; the same as user code, and this is no exception! <a href="https://docs.rs/bevy/0.8.0/bevy/pbr/trait.Material.html"><code>Material</code></a> also works seamlessly with our more advanced shader features, such as <a href="https://github.com/bevyengine/bevy/blob/v0.8.0/examples/shader/shader_defs.rs">shader pipeline specialization</a>.</p> +<p>There is also an equivalent <a href="https://docs.rs/bevy/0.8.0/bevy/sprite/trait.Material2d.html"><code>Material2d</code></a> trait, which enables custom materials in 2D.</p> +<h2 id="camera-driven-rendering">Camera-Driven Rendering +<a class="anchor-link" href="#camera-driven-rendering">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>In previous versions of Bevy, <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/struct.Camera.html"><code>Cameras</code></a> were selected and run as a part of one &quot;global&quot; <a href="https://docs.rs/bevy/0.8.0/bevy/render/render_graph/struct.RenderGraph.html"><code>RenderGraph</code></a>. There could only be one &quot;active&quot; camera of a given type, and that camera could only render to one target. The only way to render from multiple perspectives at the same time was to manually extend the render graph with duplicate logic. This was <em>full</em> of complicated low-level renderer boilerplate that wasn't approachable for the average Bevy user.</p> +<p>In <strong>Bevy 0.8</strong>, each <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a> now configures what it renders, how it renders, and what it renders to. An enabled camera will start a new run of a <a href="https://docs.rs/bevy/0.8.0/bevy/render/render_graph/struct.RenderGraph.html"><code>RenderGraph</code></a> to a specified <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/enum.RenderTarget.html"><code>RenderTarget</code></a>. The render graph defines <a href="/news/bevy-0-6/#render-graphs-and-sub-graphs">modular render logic</a> for the given camera and the render target defines the window or texture the graph will render to.</p> +<p>This makes scenarios that were previously hundreds (or thousands) of lines of code as simple as setting a few fields on the <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a> entity:</p> +<h3 id="render-to-textures">Render to Textures +<a class="anchor-link" href="#render-to-textures">#</a> +</h3> +<p>Rendering a <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a> to a texture is now a single line of code:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">camera<span class="z-punctuation z-accessor z-dot z-rust">.</span>target <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">RenderTarget<span class="z-punctuation z-accessor z-rust">::</span></span>Image<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>image_handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This enables too many scenarios to count: portals, rendering UI to a texture and rendering it in 3d space, in-game security cameras, real-time player portraits rendered in UI widgets ... the sky is the limit!</p> +<p>Here is an example of a &quot;portal effect&quot;:</p> +<p><video controls loop><source src="portals.mp4" type="video/mp4"/></video></p> +<p>This is accomplished by rendering a second camera to a texture, synchronizing its orientation with the main player's camera, and using that texture in the main camera's scene.</p> +<h3 id="split-screen">Split Screen +<a class="anchor-link" href="#split-screen">#</a> +</h3> +<p>Each <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a> now has an optional <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/struct.Viewport.html"><code>Viewport</code></a>, which if set will draw to a section of a <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/enum.RenderTarget.html"><code>RenderTarget</code></a> instead of the whole. If you spawn two active cameras and set each camera's <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/struct.Viewport.html"><code>Viewport</code></a> to draw to half of the window, you have simple, painless split screen!</p> +<p><img src="https://bevyengine.org/news/bevy-0-8/split_screen.jpg" alt="split screen" /></p> +<h3 id="layered-rendering">Layered Rendering +<a class="anchor-link" href="#layered-rendering">#</a> +</h3> +<p>Cameras can now be layered on top of each other using the new &quot;camera priority&quot; field:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This camera defaults to priority 0 and is rendered &quot;first&quot; / &quot;at the back&quot; +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Camera3dBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Camera3dBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + camera_3d<span class="z-punctuation z-separator z-rust">:</span> Camera3d <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> don&#39;t clear the color while rendering this camera +</span> clear_color<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">ClearColorConfig<span class="z-punctuation z-accessor z-rust">::</span></span>None<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + camera<span class="z-punctuation z-separator z-rust">:</span> Camera <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> renders after / on top of the main camera +</span> priority<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>&quot;Priority&quot; determines the order cameras are drawn in. The &quot;portal&quot; effect in the <a href="https://bevyengine.org/news/bevy-0-8/#render-to-textures">render to textures example above</a> uses priority to render the &quot;portal&quot; camera first, ensuring it is ready to be used by the main camera.</p> +<p>Here is a simple example of two cameras rendering to the same window:</p> +<p><img src="https://bevyengine.org/news/bevy-0-8/camera_layering.png" alt="camera layering" /></p> +<p>This can be used for things like &quot;custom UI passes&quot;, &quot;minimaps&quot;, etc.</p> +<h3 id="ergonomic-target-size-access">Ergonomic Target Size Access +<a class="anchor-link" href="#ergonomic-target-size-access">#</a> +</h3> +<p>Cameras now store their <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/enum.RenderTarget.html"><code>RenderTarget</code></a> size locally, which makes retrieving the size much simpler:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Much nicer than needing to look up the size on the target Window or Image manually, +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> like you had to in previous Bevy versions! +</span><span class="z-storage z-type z-rust">let</span> target_size <span class="z-keyword z-operator z-assignment z-rust">=</span> camera<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">logical_target_size</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> viewport_size <span class="z-keyword z-operator z-assignment z-rust">=</span> camera<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">logical_viewport_size</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This also means that converting world to screen coordinates for a camera is much easier than it used to be:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Bevy 0.7 (old) +</span>camera<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">world_to_screen</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>windows<span class="z-punctuation z-separator z-rust">,</span> images<span class="z-punctuation z-separator z-rust">,</span> camera_transform<span class="z-punctuation z-separator z-rust">,</span> world_position</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Bevy 0.8 (new) +</span>camera<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">world_to_viewport</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>camera_transform<span class="z-punctuation z-separator z-rust">,</span> world_position</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="new-camera-bundles">New Camera Bundles +<a class="anchor-link" href="#new-camera-bundles">#</a> +</h3> +<p>The old <code>OrthographicCameraBundle</code> and <code>PerspectiveCameraBundle</code> have been replaced with <a href="https://docs.rs/bevy/0.8.0/bevy/core_pipeline/core_3d/struct.Camera3dBundle.html"><code>Camera3dBundle</code></a> and <a href="https://docs.rs/bevy/0.8.0/bevy/core_pipeline/core_2d/struct.Camera2dBundle.html"><code>Camera2dBundle</code></a>. In most cases migration should be as simple as replacing the old names with the new ones. 3D cameras default to &quot;perspective&quot; projections, but they can still be switched to orthographic using the new <a href="https://docs.rs/bevy/0.8.0/bevy/core_pipeline/core_3d/struct.Camera3dBundle.html#structfield.projection"><code>Projection</code></a> component in the bundle.</p> +<h3 id="no-more-camerauibundle">No More CameraUiBundle! +<a class="anchor-link" href="#no-more-camerauibundle">#</a> +</h3> +<p>Bevy UI now no longer needs a separate camera entity to work. UI &quot;just works&quot; for all camera types and can be enabled or disabled per-camera using the <a href="https://docs.rs/bevy/0.8.0/bevy/ui/entity/struct.UiCameraConfig.html"><code>UiCameraConfig</code></a> component.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Camera3dBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>UiCameraConfig <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + show_ui<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-language z-rust">false</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="custom-render-graphs">Custom Render Graphs +<a class="anchor-link" href="#custom-render-graphs">#</a> +</h3> +<p>The default 2D and 3D <a href="https://docs.rs/bevy/0.8.0/bevy/render/render_graph/struct.RenderGraph.html"><code>RenderGraphs</code></a> for each <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a> can be overridden by setting the <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/struct.CameraRenderGraph.html"><code>CameraRenderGraph</code></a> component:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Camera3dBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + camera_render_graph<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">CameraRenderGraph<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_custom_graph</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This enables you to draw the camera with whatever custom render logic you need! For example, you could replace the built in clustered-forward-rendering with deferred rendering. Note that this generally won't be required: most custom rendering scenarios will be covered by high-level <a href="https://bevyengine.org/news/bevy-0-8/#new-material-system">Materials</a> or extending the built-in render graphs. And using the default render graph will ensure maximum compatibility with other plugins.</p> +<h3 id="enabling-disabling-cameras">Enabling / Disabling Cameras +<a class="anchor-link" href="#enabling-disabling-cameras">#</a> +</h3> +<p>If a camera is &quot;active&quot;, it will render to its <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/enum.RenderTarget.html"><code>RenderTarget</code></a>. To activate or deactivate a camera, set the new <code>is_active</code> field:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">camera<span class="z-punctuation z-accessor z-dot z-rust">.</span>is_active <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-constant z-language z-rust">true</span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="renderlayers">RenderLayers +<a class="anchor-link" href="#renderlayers">#</a> +</h3> +<p>Bevy's existing <a href="https://docs.rs/bevy/0.8.0/bevy/render/view/visibility/struct.RenderLayers.html"><code>RenderLayers</code></a> system can be used to tell a <a href="https://docs.rs/bevy/0.8.0/bevy/render/camera/struct.Camera.html"><code>Camera</code></a> to only render entities on specific layers. <strong>Camera-Driven Rendering</strong> pairs nicely with this feature. This enables rendering one set of entities to one camera and another set of entities to another camera. We've ported the <a href="https://docs.rs/bevy/0.8.0/bevy/render/view/visibility/struct.RenderLayers.html"><code>RenderLayers</code></a> system to all entities with <a href="https://docs.rs/bevy/0.8.0/bevy/render/view/struct.Visibility.html"><code>Visibility</code></a>, so this will all Just Work™.</p> +<h2 id="spotlights">Spotlights +<a class="anchor-link" href="#spotlights">#</a> +</h2> +<div class="release-feature-authors">authors: @robtfm</div> +<p>Bevy now has a <a href="https://docs.rs/bevy/0.8.0/bevy/pbr/struct.SpotLight.html"><code>SpotLight</code></a> entity type, which emits light in a cone shape from a point in space.</p> +<p><img src="https://bevyengine.org/news/bevy-0-8/spotlight.png" alt="spotlight" /></p> +<h2 id="visibility-inheritance">Visibility Inheritance +<a class="anchor-link" href="#visibility-inheritance">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132, @cart</div> +<p>Visibility in entity hierarchies (using the <a href="https://docs.rs/bevy/0.8.0/bevy/render/view/struct.Visibility.html"><code>Visibility</code></a> component) now propagates down the hierarchy. This is hugely useful, as entities in a game often have <em>many</em> entities nested beneath them. A &quot;player entity&quot; is often made up of many pieces: the player sprite or mesh, what the player is wearing / holding, visual effects, etc.</p> +<p>Visibility inheritance means that you only need to hide the top level &quot;player&quot; entity in your code and everything beneath it will be hidden for you.</p> +<p>This &quot;flight helmet&quot; scene consists of many &quot;pieces&quot; nested under the main helmet entity. Hiding all of these &quot;sub entities&quot; is as now as easy as hiding the top level helmet entity.</p> +<p><video controls loop><source src="visibility_inheritance.mp4" type="video/mp4"/></video></p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">hide_helmets</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">helmet_visibilities</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Visibility, <span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Helmet<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> helmet_visibility <span class="z-keyword z-operator z-assignment z-rust">=</span> helmet_visibilities<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">single_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + helmet_visibility<span class="z-punctuation z-accessor z-dot z-rust">.</span>is_visible <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-constant z-language z-rust">false</span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>In past versions of Bevy, you had to hide each piece manually!</p> +<p>The &quot;inherited visibility&quot; is computed in the <a href="https://docs.rs/bevy/0.8.0/bevy/app/enum.CoreStage.html#variant.PostUpdate"><code>PostUpdate</code></a> stage and stored on the <a href="https://docs.rs/bevy/0.8.0/bevy/render/view/struct.ComputedVisibility.html"><code>ComputedVisibility</code></a> component. <a href="https://docs.rs/bevy/0.8.0/bevy/render/view/struct.ComputedVisibility.html"><code>ComputedVisibility</code></a> now has the following functions:</p> +<ul> +<li><code>is_visible_in_hierarchy()</code>: Whether or not the entity is visible according to &quot;visibility inheritance&quot;.</li> +<li><code>is_visible_in_view()</code>: Whether or not the entity is visible in any view. This is used for culling entities in cases like &quot;frustum culling&quot;.</li> +<li><code>is_visible()</code>: The canonical place to determine whether or not an entity will be drawn. Combines &quot;view visibility&quot; and &quot;hierarchy visibility&quot;.</li> +</ul> +<h3 id="spatialbundle-and-visibilitybundle">SpatialBundle and VisibilityBundle +<a class="anchor-link" href="#spatialbundle-and-visibilitybundle">#</a> +</h3> +<div class="release-feature-authors">authors: @mockersf, @rparrett</div> +<p>With the addition of <a href="https://bevyengine.org/news/bevy-0-8/#visibility-inheritance">Visibility Inheritance</a> comes the constraint that visibility propagation requires all elements in the hierarchy to have the appropriate visibility components. When constructing scenes, developers often want to group entities under parent &quot;organizational&quot; entities, which exist solely to group entities together, reposition them, and hide them as a unit. These &quot;organizational&quot; entities still require visibility components to propagate the <a href="https://docs.rs/bevy/0.8.0/bevy/transform/components/struct.Transform.html"><code>Transform</code></a> and <a href="https://docs.rs/bevy/0.8.0/bevy/render/view/struct.Visibility.html"><code>Visibility</code></a> to <a href="https://docs.rs/bevy/0.8.0/bevy/transform/components/struct.GlobalTransform.html"><code>GlobalTransform</code></a> and <a href="https://docs.rs/bevy/0.8.0/bevy/render/view/struct.ComputedVisibility.html"><code>ComputedVisibility</code></a> (respectively).</p> +<p>To make this easy, we've added a new <a href="https://docs.rs/bevy/0.8.0/bevy/render/prelude/struct.SpatialBundle.html"><code>SpatialBundle</code></a>, which adds the components mentioned above. This allows the entity to configure and propagate visibility and transform data without incurring the cost of actually rendering it.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This entity controls the position and visibility of the entities beneath it. +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpatialBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + transform<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Transform<span class="z-punctuation z-accessor z-rust">::</span></span>from_xyz<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">20.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">30.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + visibility<span class="z-punctuation z-separator z-rust">:</span> Visibility <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + is_visible<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-language z-rust">true</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">parent</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + parent + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">TableBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">ShopKeeperBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PotionBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>To ensure visibility and transforms are propagated, make sure the whole hierarchy (root -&gt; leaf) has these components:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SpatialBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">parent</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + parent + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SpatialBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">parent</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + parent<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SpatialBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>If you know you don't need <a href="https://docs.rs/bevy/0.8.0/bevy/transform/components/struct.Transform.html"><code>Transform</code></a> propagation (or your entity already has those components), you can instead use the new <a href="https://docs.rs/bevy/0.8.0/bevy/render/view/struct.VisibilityBundle.html"><code>VisibilityBundle</code></a>, which only adds the components required for visibility propagation.</p> +<h2 id="built-in-shader-modularization">Built-in Shader Modularization +<a class="anchor-link" href="#built-in-shader-modularization">#</a> +</h2> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p>In <strong>Bevy 0.8</strong>, we've started modularizing our built-in shaders. Notably, this means you can now import and run the built-in PBR shader / lighting logic:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-operator z-rust">#</span>import <span class="z-meta z-path z-rust">bevy_pbr<span class="z-punctuation z-accessor z-rust">::</span></span>utils +<span class="z-keyword z-operator z-rust">#</span>import <span class="z-meta z-path z-rust">bevy_pbr<span class="z-punctuation z-accessor z-rust">::</span></span>clustered_forward +<span class="z-keyword z-operator z-rust">#</span>import <span class="z-meta z-path z-rust">bevy_pbr<span class="z-punctuation z-accessor z-rust">::</span></span>lighting +<span class="z-keyword z-operator z-rust">#</span>import <span class="z-meta z-path z-rust">bevy_pbr<span class="z-punctuation z-accessor z-rust">::</span></span>shadows +<span class="z-keyword z-operator z-rust">#</span>import <span class="z-meta z-path z-rust">bevy_pbr<span class="z-punctuation z-accessor z-rust">::</span></span>pbr_types +<span class="z-keyword z-operator z-rust">#</span>import <span class="z-meta z-path z-rust">bevy_pbr<span class="z-punctuation z-accessor z-rust">::</span></span>pbr_functions + +<span class="z-keyword z-operator z-rust">@</span>fragment +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">fragment</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">in</span><span class="z-punctuation z-separator z-rust">:</span> FragmentInput</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> </span></span><span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">location</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + var pbr_input<span class="z-punctuation z-separator z-rust">:</span> PbrInput <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-function z-rust">pbr_input_new</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> set the base color to red +</span> pbr_input<span class="z-punctuation z-accessor z-dot z-rust">.</span>material<span class="z-punctuation z-accessor z-dot z-rust">.</span>base_color <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> set other PbrInput fields here <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> + <span class="z-keyword z-control z-rust">return</span> <span class="z-support z-function z-rust">tone_mapping</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-support z-function z-rust">pbr</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>pbr_input</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>We've also modularized our mesh and view binding shader logic. When paired with the <a href="https://bevyengine.org/news/bevy-0-8/#new-material-system">New Material System</a>, users can now reasonably write custom PBR materials without re-defining all of the PBR logic in their shaders. The new <a href="https://github.com/bevyengine/bevy/blob/v0.8.0/examples/shader/array_texture.rs">Array Texture Example</a> illustrates how to define a custom PBR shader material using these new APIs:</p> +<p><img src="https://bevyengine.org/news/bevy-0-8/array_texture.png" alt="array texture" /></p> +<p>We also plan on evolving the user experience here. Now that we've broken everything up and modularized it, we'll work on reducing the amount of boilerplate required to extend this logic (cutting down on imports, removing the need to set all PbrInput fields, etc).</p> +<h2 id="wgpu-0-13-new-wgsl-shader-syntax">wgpu 0.13: New WGSL Shader Syntax +<a class="anchor-link" href="#wgpu-0-13-new-wgsl-shader-syntax">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf, wgpu and naga contributors</div> +<p>We've updated to the latest and greatest wgpu version. wgpu 0.13 brings plenty of fixes and improvements, but the most visible change is the new more ergonomic WGSL &quot;attribute&quot; syntax:</p> +<p>Bindings now look like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> wgpu 0.12 (old) +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">group</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-function z-rust">binding</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-generic z-rust">var<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>uniform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> material<span class="z-punctuation z-separator z-rust">:</span> Material<span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> wgpu 0.13 (new) +</span><span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">group</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">binding</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +<span class="z-meta z-generic z-rust">var<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>uniform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> material<span class="z-punctuation z-separator z-rust">:</span> Material<span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Shader stage entry points and inputs now look like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> wgpu 0.12 (old) +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>vertex</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">vertex</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span>[[location<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust">0</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span>]] <span class="z-variable z-parameter z-rust">position</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">vec3<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, [[location<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust">1</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span>]] <span class="z-variable z-parameter z-rust">normal</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">vec3<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> VertexOutput</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> wgpu 0.13 (new) +</span><span class="z-keyword z-operator z-rust">@</span>vertex +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">vertex</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span>@location<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust">0</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-variable z-parameter z-rust">position</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">vec3<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, @location<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust">1</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-variable z-parameter z-rust">normal</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">vec3<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> VertexOutput</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Much easier on the eyes! (and the fingers!)</p> +<h2 id="scene-bundle">Scene Bundle +<a class="anchor-link" href="#scene-bundle">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>In previous versions of Bevy scenes were spawned like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_scene</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>some.gltf#Scene0<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This worked, but it made it difficult to actually use the scene in practice. Repositioning the scene required either manually grabbing the scene's entity id and then repositioning it when it spawns, or creating a parent entity with the relevant transform components and &quot;spawning the scene as a child&quot;. Additionally, it was challenging to extend scenes with new components.</p> +<p>In <strong>Bevy 0.8</strong>, we've added a <a href="https://docs.rs/bevy/0.8.0/bevy/scene/struct.SceneBundle.html"><code>SceneBundle</code></a>, which brings scene spawning in line with our other entity construction APIs:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SceneBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + scene<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>some.gltf#Scene0<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>When the scene loads, it will automatically spawn underneath the entity created by the <code>spawn_bundle</code> command. This makes it much easier to transform the scene and add new components at the &quot;root&quot;:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SceneBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + scene<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>player.gltf#Scene0<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + transform<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Transform<span class="z-punctuation z-accessor z-rust">::</span></span>from_xyz<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">20.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">30.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Player<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="parallel-frustum-culling">Parallel Frustum Culling +<a class="anchor-link" href="#parallel-frustum-culling">#</a> +</h2> +<div class="release-feature-authors">authors: @aevyrie</div> +<p>Bevy uses <a href="/news/bevy-0-6/#visibility-and-frustum-culling">&quot;frustum culling&quot;</a> to skip drawing entities that are outside of the camera's view. In <strong>Bevy 0.8</strong>, frustum culling is now done in parallel. When culling thousands of entities, this yields significant performance improvements:</p> +<h3 id="frustum-culling-system-time-vs-number-of-entities-culled-lower-is-better">frustum culling system time vs number of entities culled (lower is better) +<a class="anchor-link" href="#frustum-culling-system-time-vs-number-of-entities-culled-lower-is-better">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-8/parallel_frustum_culling.png" alt="parallel frustum culling" /></p> +<p>Note that &quot;parallel b&quot; stand for &quot;parallel batch size&quot; (number of entities in each batch). We selected 1024 as our batch size in <strong>Bevy 0.8</strong>, as that performs better.</p> +<h2 id="automatic-mesh-tangent-generation">Automatic Mesh Tangent Generation +<a class="anchor-link" href="#automatic-mesh-tangent-generation">#</a> +</h2> +<div class="release-feature-authors">authors: Rob Swain (@superdump), @jakobhellermann, @DJMcNab</div> +<p>Vertex tangents are used in tandem with normal maps to give meshes more detailed normals when rendering them. Some imported meshes have normal maps, but don't have vertex tangents calculated. Bevy can now automatically generate vertex tangents for <a href="https://docs.rs/bevy/0.8.0/bevy/render/mesh/struct.Mesh.html"><code>Meshes</code></a> that are missing them using the defacto industry-standard MikkTSpace library / algorithm (Godot, Unity, Unreal, and Blender all use this).</p> +<p>We have started maintaining <a href="https://github.com/bevyengine/bevy/tree/v0.8.0/crates/bevy_mikktspace">our own fork</a> of the <a href="https://github.com/gltf-rs/mikktspace">gltf-rs/mikktspace crate</a> so we can:</p> +<ul> +<li>update dependencies at the speed required for Bevy;</li> +<li><a href="https://github.com/bevyengine/bevy/pull/4932">start reining in the unsafe code</a>, as it currently uses unsafe Rust code auto-generated from the original <code>mikktspace.h</code> written in C.</li> +</ul> +<h2 id="default-to-linear-texture-filtering">Default to Linear Texture Filtering +<a class="anchor-link" href="#default-to-linear-texture-filtering">#</a> +</h2> +<div class="release-feature-authors">authors: @aevyrie, @cart</div> +<p>Images in Bevy now use linear texture filtering by default, which is more in line with the rest of the gamedev ecosystem (Unity and Godot both default to filtered textures).</p> +<p>This means that textures that require unfiltered pixels (such as &quot;pixel art&quot; sprites) must override this default, either per-image:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">image<span class="z-punctuation z-accessor z-dot z-rust">.</span>sampler_descriptor <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">ImageSampler<span class="z-punctuation z-accessor z-rust">::</span></span>nearest<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>or globally using the new <a href="https://docs.rs/bevy/0.8.0/bevy/render/texture/struct.ImageSettings.html"><code>ImageSettings</code></a> resource:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">ImageSettings<span class="z-punctuation z-accessor z-rust">::</span></span>default_nearest<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>With that, we get crisp pixel art:</p> +<p><img src="https://bevyengine.org/news/bevy-0-8/sprite.png" alt="sprite" /></p> +<h2 id="new-globaltransform-matrix-representation">New GlobalTransform Matrix Representation +<a class="anchor-link" href="#new-globaltransform-matrix-representation">#</a> +</h2> +<div class="release-feature-authors">authors: @HackerFoo</div> +<p>The internal representation of the <a href="https://docs.rs/bevy/0.8.0/bevy/transform/components/struct.GlobalTransform.html"><code>GlobalTransform</code></a> component (representing the &quot;world space&quot; transform for an entity) has been changed from a &quot;similarity&quot; (translation <a href="https://docs.rs/bevy/0.8.0/bevy/math/struct.Vec3.html"><code>Vec3</code></a> / rotation <a href="https://docs.rs/bevy/0.8.0/bevy/math/struct.Quat.html"><code>Quat</code></a> / scale <a href="https://docs.rs/bevy/0.8.0/bevy/math/struct.Vec3.html"><code>Vec3</code></a>) to an &quot;affine 3D transform&quot; (<a href="https://docs.rs/bevy/0.8.0/bevy/math/struct.Mat3A.html"><code>Mat3A</code></a> and a <a href="https://docs.rs/bevy/0.8.0/bevy/math/struct.Vec3.html"><code>Vec3</code></a> translation).</p> +<p>Notably, this allows for shear to be represented. Shear is a controversial topic. Engine and physics programmers tend to hate it. Artists tend to love it. Given that most artist tools and game engines support shear in their equivalent types, we believe it is important to provide this as an option.</p> +<h2 id="shadertype-derive">ShaderType derive +<a class="anchor-link" href="#shadertype-derive">#</a> +</h2> +<div class="release-feature-authors">authors: @teoxoy</div> +<p><strong>Bevy 0.8</strong> now uses the <a href="https://docs.rs/bevy/0.8.0/bevy/render/render_resource/trait.ShaderType.html"><code>ShaderType</code></a> trait / derive (provided by the <a href="https://github.com/teoxoy/encase">encase</a> crate) to easily convert Rust data types to GPU-compatible shader data types.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> ShaderType requires each field to implement ShaderType, +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> which Bevy&#39;s math types and Color type implement. +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">ShaderType</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">SpriteData</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">position</span><span class="z-punctuation z-separator z-type z-rust">:</span> Vec2, + <span class="z-variable z-other z-member z-rust">color</span><span class="z-punctuation z-separator z-type z-rust">:</span> Color, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>And on the WGSL shader side it looks like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">SpriteData</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">position</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">vec2<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">color</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">group</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">@</span><span class="z-support z-function z-rust">binding</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +<span class="z-meta z-generic z-rust">var<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>uniform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> sprite_data<span class="z-punctuation z-separator z-rust">:</span> SpriteData<span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This trait can be used in the <a href="https://bevyengine.org/news/bevy-0-8/#new-material-system">new Material system</a> if you need to define custom shader uniform or buffer bindings.</p> +<p><a href="https://docs.rs/bevy/0.8.0/bevy/render/render_resource/trait.ShaderType.html"><code>ShaderType</code></a> replaces the <code>AsStd140</code> and <code>AsStd430</code> traits / derives (provided by the <a href="https://github.com/LPGhatguy/crevice">crevice</a> crate) used in previous Bevy versions. This simplifies (and clarifies) the &quot;how to transfer data to the GPU&quot; story in Bevy, while also adding new features, such as support for unbounded Rust vecs (for storage buffers) and configurable dynamic offsets for uniform and storage buffers.</p> +<p>For example, Bevy's built-in lighting pipeline was adjusted to take advantage of this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">ShaderType</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">GpuPointLightsStorage</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">size</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">runtime</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-variable z-other z-member z-rust">data</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>GpuPointLight<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="render-phase-sorting-optimization">Render Phase Sorting Optimization +<a class="anchor-link" href="#render-phase-sorting-optimization">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132, Rob Swain (@superdump)</div> +<p>Bevy uses &quot;render phases&quot; to collect per-entity render logic for a render pass. These phases can be sorted to control draw order for a variety of reasons: back-to-front depth sorting for transparency correctness and front-to-back sorting for early fragment discarding during opaque rendering.</p> +<p>When possible, <strong>Bevy 0.8</strong> now uses &quot;unstable sorts&quot; (currently &quot;radix sort&quot;), which yields a significant performance improvement:</p> +<h3 id="many-cubes-stress-test-opaque-phase-sort-times-in-milliseconds-less-is-better">many_cubes stress test &quot;opaque phase&quot; sort times (in milliseconds, less is better) +<a class="anchor-link" href="#many-cubes-stress-test-opaque-phase-sort-times-in-milliseconds-less-is-better">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-8/unstable_sort.svg" alt="unstable sort" /></p> +<h2 id="vertex-colors">Vertex Colors +<a class="anchor-link" href="#vertex-colors">#</a> +</h2> +<div class="release-feature-authors">authors: @HackerFoo, @thebracket</div> +<p>Bevy's 2D and 3D pipelines and <a href="https://docs.rs/bevy/0.8.0/bevy/pbr/trait.Material.html"><code>Materials</code></a> now support vertex colors, if a given <a href="https://docs.rs/bevy/0.8.0/bevy/render/mesh/struct.Mesh.html"><code>Mesh</code></a> provides them. The PBR <a href="https://docs.rs/bevy/0.8.0/bevy/pbr/struct.StandardMaterial.html"><code>StandardMaterial</code></a> and the 2D <a href="https://docs.rs/bevy/0.8.0/bevy/sprite/struct.ColorMaterial.html"><code>ColorMaterial</code></a> build on this and will use the vertex colors if they are set:</p> +<p><img src="https://bevyengine.org/news/bevy-0-8/vertex_colors.png" alt="vertex colors" /></p> +<h2 id="regular-polygon-and-circle-mesh-primitives">Regular Polygon and Circle Mesh Primitives +<a class="anchor-link" href="#regular-polygon-and-circle-mesh-primitives">#</a> +</h2> +<div class="release-feature-authors">authors: @rparrett</div> +<p>Bevy now has <a href="https://docs.rs/bevy/0.8.0/bevy/prelude/shape/struct.Circle.html"><code>Circle</code></a> and <a href="https://docs.rs/bevy/0.8.0/bevy/prelude/shape/struct.RegularPolygon.html"><code>RegularPolygon</code></a> <a href="https://docs.rs/bevy/0.8.0/bevy/render/mesh/struct.Mesh.html"><code>Mesh</code></a> shapes:</p> +<p><img src="https://bevyengine.org/news/bevy-0-8/shapes.png" alt="shapes" /></p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> pentagon <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">RegularPolygon<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">5</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> handle <span class="z-keyword z-operator z-assignment z-rust">=</span> meshes<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Mesh<span class="z-punctuation z-accessor z-rust">::</span></span>from<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>pentagon</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>ColorMesh2dBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + mesh<span class="z-punctuation z-separator z-rust">:</span> handle<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="scripting-and-modding-progress-untyped-ecs-apis">Scripting and Modding Progress: Untyped ECS APIs +<a class="anchor-link" href="#scripting-and-modding-progress-untyped-ecs-apis">#</a> +</h2> +<div class="release-feature-authors">authors: @jakobhellermann</div> +<p>Bevy officially only supports Rust as the &quot;one true way to define app logic&quot;. We have <a href="https://github.com/bevyengine/bevy/issues/114#issuecomment-672397351">very good reasons for this</a> and that philosophy likely won't change any time soon. But we <em>do</em> want to provide the tools needed for the community to build 3rd party scripting / modding plugins for their languages of choice.</p> +<p>When we <a href="https://bevyengine.org/news/bevy-0-5/#bevy-ecs-v2">released Bevy ECS V2</a>, we intentionally built our internal ECS storage with these cases in mind. But we didn't expose public APIs that made it possible to interact with ECS data without normal Rust types.</p> +<p><strong>Bevy 0.8</strong> adds public &quot;untyped&quot; ECS apis that enable retrieving <a href="https://bevyengine.org/news/bevy-0-8/#ecs-lifetimed-pointers">lifetimed pointers</a> to component and resource data using <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/component/struct.ComponentId.html"><code>ComponentId</code></a> instead of actual Rust types.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> health_ptr<span class="z-punctuation z-separator z-rust">:</span> Ptr <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>player</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_by_id</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>heath_component_id</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>These, when combined with our reflection APIs, provide the tools needed to start building scripting support!</p> +<p><code>@jakobhellermann</code> has <a href="https://github.com/jakobhellermann/bevy_mod_js_scripting/blob/main/assets/scripts/debug.ts">started building their own JavaScript / TypeScript plugin for Bevy</a>. Note that:</p> +<ol> +<li>This plugin is still very much a work in progress and is not ready to be used in projects.</li> +<li>This is an unofficial community effort. Bevy will not be adding official JavaScript/TypeScript support.</li> +</ol> +<p>Here is a TypeScript snippet from their repository that queries Bevy ECS data from the script:</p> +<pre data-lang="typescript" class="language-typescript z-code"><code class="language-typescript" data-lang="typescript"><span class="z-source z-ts"><span class="z-meta z-var z-expr z-ts"><span class="z-storage z-type z-ts">const</span> <span class="z-meta z-var-single-variable z-expr z-ts"><span class="z-meta z-definition z-variable z-ts"><span class="z-variable z-other z-constant z-ts">ballQuery</span></span> </span><span class="z-keyword z-operator z-assignment z-ts">=</span> <span class="z-meta z-function-call z-ts"><span class="z-variable z-other z-object z-ts">world</span><span class="z-punctuation z-accessor z-ts">.</span><span class="z-entity z-name z-function z-ts">query</span></span><span class="z-meta z-brace z-round z-ts">(</span><span class="z-meta z-objectliteral z-ts"><span class="z-punctuation z-definition z-block z-ts">{</span> + <span class="z-meta z-object z-member z-ts"><span class="z-meta z-object-literal z-key z-ts">components</span></span><span class="z-meta z-object z-member z-ts"><span class="z-meta z-object-literal z-key z-ts"><span class="z-punctuation z-separator z-key-value z-ts">:</span></span><span class="z-meta z-array z-literal z-ts"> <span class="z-meta z-brace z-square z-ts">[</span><span class="z-variable z-other z-readwrite z-ts">ballId</span><span class="z-punctuation z-separator z-comma z-ts">,</span> <span class="z-variable z-other z-readwrite z-ts">transformId</span><span class="z-punctuation z-separator z-comma z-ts">,</span> <span class="z-variable z-other z-readwrite z-ts">velocityId</span><span class="z-meta z-brace z-square z-ts">]</span></span></span><span class="z-punctuation z-separator z-comma z-ts">,</span> +<span class="z-punctuation z-definition z-block z-ts">}</span></span><span class="z-meta z-brace z-round z-ts">)</span></span><span class="z-punctuation z-terminator z-statement z-ts">;</span> +<span class="z-keyword z-control z-loop z-ts">for</span> <span class="z-meta z-brace z-round z-ts">(</span><span class="z-meta z-var z-expr z-ts"><span class="z-storage z-type z-ts">const</span> <span class="z-meta z-var-single-variable z-expr z-ts"><span class="z-meta z-definition z-variable z-ts"><span class="z-variable z-other z-constant z-ts">item</span></span> </span></span><span class="z-keyword z-operator z-expression z-of z-ts">of</span> <span class="z-variable z-other z-readwrite z-ts">ballQuery</span><span class="z-meta z-brace z-round z-ts">)</span> <span class="z-meta z-block z-ts"><span class="z-punctuation z-definition z-block z-ts">{</span> + <span class="z-meta z-var z-expr z-ts"><span class="z-storage z-type z-ts">let</span> <span class="z-meta z-array-binding-pattern-variable z-ts"><span class="z-punctuation z-definition z-binding-pattern z-array z-ts">[</span><span class="z-meta z-definition z-variable z-ts"><span class="z-variable z-other z-readwrite z-ts">ball</span></span><span class="z-punctuation z-separator z-comma z-ts">,</span> <span class="z-meta z-definition z-variable z-ts"><span class="z-variable z-other z-readwrite z-ts">transform</span></span><span class="z-punctuation z-separator z-comma z-ts">,</span> <span class="z-meta z-definition z-variable z-ts"><span class="z-variable z-other z-readwrite z-ts">velocity</span></span><span class="z-punctuation z-definition z-binding-pattern z-array z-ts">]</span> </span><span class="z-keyword z-operator z-assignment z-ts">=</span> <span class="z-variable z-other z-object z-ts">item</span><span class="z-punctuation z-accessor z-ts">.</span><span class="z-support z-variable z-property z-dom z-ts">components</span></span><span class="z-punctuation z-terminator z-statement z-ts">;</span> + <span class="z-variable z-other z-readwrite z-ts">velocity</span> <span class="z-keyword z-operator z-assignment z-ts">=</span> <span class="z-variable z-other z-readwrite z-ts">velocity</span><span class="z-meta z-array z-literal z-ts"><span class="z-meta z-brace z-square z-ts">[</span><span class="z-constant z-numeric z-decimal z-ts">0</span><span class="z-meta z-brace z-square z-ts">]</span></span><span class="z-punctuation z-terminator z-statement z-ts">;</span> + + <span class="z-meta z-function-call z-ts"><span class="z-entity z-name z-function z-ts">info</span></span><span class="z-meta z-brace z-round z-ts">(</span><span class="z-meta z-function-call z-ts"><span class="z-variable z-other z-object z-ts">velocity</span><span class="z-punctuation z-accessor z-ts">.</span><span class="z-support z-function z-ts">toString</span></span><span class="z-meta z-brace z-round z-ts">(</span><span class="z-meta z-brace z-round z-ts">)</span><span class="z-meta z-brace z-round z-ts">)</span><span class="z-punctuation z-terminator z-statement z-ts">;</span> +<span class="z-punctuation z-definition z-block z-ts">}</span></span> +</span></code></pre> +<h2 id="query-intoiter">Query IntoIter +<a class="anchor-link" href="#query-intoiter">#</a> +</h2> +<div class="release-feature-authors">authors: @TheRawMeatball</div> +<p>Bevy ECS <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Query.html"><code>Queries</code></a> now implement the <a href="https://doc.rust-lang.org/std/iter/trait.IntoIterator.html"><code>IntoIterator</code></a> trait, which provides access to Rust's nicer iteration syntax:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> In previous Bevy versions, iter/iter_mut had to be called manually: +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> player <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> player <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> In Bevy 0.8, you have the option to use this syntax: +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> player <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>players <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> player <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> players <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="query-iter-many">Query::iter_many +<a class="anchor-link" href="#query-iter-many">#</a> +</h2> +<div class="release-feature-authors">authors: @devil-ira</div> +<p>It is now possible to pass a list of entities to a <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Query.html"><code>Query</code></a> to iterate over using <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Query.html#method.iter_many"><code>Query::iter_many</code></a>, which is significantly more ergonomic than calling <code>get(entity)</code> on each individual entity:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">BlueTeam</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">members</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Entity<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">blue_team</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>BlueTeam<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">info!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Blue Team Assemble!<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-keyword z-control z-rust">for</span> player <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_many</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>blue_team<span class="z-punctuation z-accessor z-dot z-rust">.</span>members</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">info!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>{}<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> player<span class="z-punctuation z-accessor z-dot z-rust">.</span>name</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>There is also a <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Query.html#method.iter_many_mut"><code>Query::iter_many_mut</code></a>, which provides similar functionality for mutable queries. But to ensure aliased mutability is not allowed, it does not implement iterator. Instead, use this pattern:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> iter <span class="z-keyword z-operator z-assignment z-rust">=</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_many_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>blue_team<span class="z-punctuation z-accessor z-dot z-rust">.</span>members</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-control z-rust">while</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> player</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> iter<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">fetch_next</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + player<span class="z-punctuation z-accessor z-dot z-rust">.</span>score <span class="z-keyword z-operator z-assignment z-rust">+=</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<h2 id="convert-mutable-queries-to-read-only">Convert Mutable Queries to Read-only +<a class="anchor-link" href="#convert-mutable-queries-to-read-only">#</a> +</h2> +<div class="release-feature-authors">authors: @harudagondi</div> +<p>Mutable <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Query.html"><code>Queries</code></a> can now be converted to their read-only versions, which makes it easier to build and use abstractions over queries:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> player <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> players <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> mutate players here +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-support z-function z-rust">log_players</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_readonly</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">log_players</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Players<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> player <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>players <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">info!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>{player:?}<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="ecs-lifetimed-pointers">ECS &quot;lifetimed pointers&quot; +<a class="anchor-link" href="#ecs-lifetimed-pointers">#</a> +</h2> +<div class="release-feature-authors">authors: @TheRawMeatball, @BoxyUwU, @jakobhellermann</div> +<p>Bevy ECS has been refactored to use lifetimed, type-erased pointers instead of &quot;raw pointers&quot;, which significantly improved the safety and legibility of our internals without compromising performance or flexibility.</p> +<p>From a high level, this enables us to &quot;retain&quot; the lifetime of World borrows throughout our internals while still using type-erased APIs to support scenarios like <a href="https://bevyengine.org/news/bevy-0-8/#scripting-and-modding-progress-untyped-ecs-apis">3rd party scripting languages</a>.</p> +<p>By retaining this lifetime, we can rely more on Rust's borrow checker to yell at us when we are doing something unsound. And, as it happens, this caught a number of soundness bugs!</p> +<h2 id="ecs-query-internals-refactors">ECS Query Internals Refactors +<a class="anchor-link" href="#ecs-query-internals-refactors">#</a> +</h2> +<div class="release-feature-authors">authors: @BoxyUwU</div> +<p><code>@BoxyUwU</code> has been hard at work refactoring our <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Query.html"><code>Query</code></a> internals to be simpler and easier to read:</p> +<ul> +<li><code>ReadOnlyFetch</code> was replaced with <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/query/trait.ReadOnlyWorldQuery.html"><code>ReadOnlyWorldQuery</code></a>, moving this trait constraint &quot;up a level&quot;, making it easier to express in the type system.</li> +<li>&quot;QF Fetch generics&quot; were removed from <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Query.html"><code>Query</code></a> and <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/query/struct.QueryState.html"><code>QueryState</code></a> methods and types in favor of <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/query/trait.WorldQuery.html"><code>WorldQuery</code></a> usage, making filters and normal fetches consistent in the type system and simpler to express.</li> +</ul> +<p>We have more changes in this vein planned for the next release. Bevy ECS internals are becoming considerably easier to understand!</p> +<h2 id="ecs-optimizations">ECS Optimizations +<a class="anchor-link" href="#ecs-optimizations">#</a> +</h2> +<div class="release-feature-authors">authors: @DJMcNab, @james7132</div> +<p>Bevy ECS had a number of optimizations this time around:</p> +<ul> +<li><code>@james7132</code> sped up entity moves between tables by reducing the number of copies conducted. For larger components, this is a huge win. The <code>many_cubes</code> stress test saw a ~16% speed boost in the <code>prepare_uniform_components</code> system, which relies heavily on commands / table moves.</li> +<li><code>@DJMcNab</code> removed no-op drop function calls for ECS storage internals, which reduced the dropping time for the <code>many_cubes</code> stress test from ~150μs to ~80μs.</li> +<li><code>@james7132</code> changed <a href="http://docs.rs/bevy/0.8.0/bevy/ecs/storage/struct.ComponentSparseSet.html"><code>ComponentSparseSet</code></a> indices from <code>usize</code> to <code>u32</code>, which makes them use less space / making some operations more cache friendly. Sparse Set iteration became ~15% faster with this change.</li> +</ul> +<h2 id="label-optimizations">Label Optimizations +<a class="anchor-link" href="#label-optimizations">#</a> +</h2> +<div class="release-feature-authors">authors: @JoJoJet</div> +<p>Bevy relies on &quot;labels&quot; to identify things like systems, stages, and apps. This is useful for things like <a href="/news/bevy-0-5/#explicit-system-dependencies-and-system-labels">defining system dependencies</a>. The traits <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/schedule/trait.SystemLabel.html"><code>SystemLabel</code></a>, <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/schedule/trait.StageLabel.html"><code>StageLabel</code></a>, and <a href="https://docs.rs/bevy/0.8.0/bevy/app/derive.AppLabel.html"><code>AppLabel</code></a> build on the same underlying &quot;typed label&quot; system. It enables developers to define custom labels while retaining type safety. Much better than using something like a string or an integer label!</p> +<p>In <strong>Bevy 0.8</strong> we've optimized the internal representation of labels by removing boxing / trait objects in favor of a single cheap-to-copy-and-compare &quot;system label id&quot; type.</p> +<p>This new representation sped up schedule construction by ~30%!</p> +<h3 id="time-to-prepare-and-compute-schedule-with-100-systems-in-milliseconds-less-is-better">time to prepare and compute schedule with 100 systems (in milliseconds, less is better) +<a class="anchor-link" href="#time-to-prepare-and-compute-schedule-with-100-systems-in-milliseconds-less-is-better">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-8/label_bench.svg" alt="label bench" /></p> +<p>This change also removed a number of trait requirements from our label derives:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old (Bevy 0.7) +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">SystemLabel<span class="z-punctuation z-separator z-rust">,</span> Debug<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> Copy<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Eq<span class="z-punctuation z-separator z-rust">,</span> Hash</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">MovementSystem</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + Velocity<span class="z-punctuation z-separator z-rust">,</span> + Gravity<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New (Bevy 0.8) +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">SystemLabel<span class="z-punctuation z-separator z-rust">,</span> Clone</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">MovementSystem</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + Velocity<span class="z-punctuation z-separator z-rust">,</span> + Gravity<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="hierarchy-commands">Hierarchy Commands +<a class="anchor-link" href="#hierarchy-commands">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132</div> +<p>Bevy's entity hierarchy system is based on two components: <a href="https://docs.rs/bevy/0.8.0/bevy/hierarchy/struct.Parent.html"><code>Parent</code></a> (which points to an entity's parent) and <a href="https://docs.rs/bevy/0.8.0/bevy/hierarchy/struct.Children.html"><code>Children</code></a> (which points to a list of the entity's children). This separation is important, as it makes it easy and cheap to query for &quot;hierarchy roots&quot;:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">roots</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Entity, <span class="z-meta z-generic z-rust">Without<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Parent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>In past versions of Bevy, we built a complex system to &quot;maintain&quot; the integrity of the hierarchy. As <a href="https://docs.rs/bevy/0.8.0/bevy/hierarchy/struct.Parent.html"><code>Parent</code></a> / <a href="https://docs.rs/bevy/0.8.0/bevy/hierarchy/struct.Children.html"><code>Children</code></a> components were added/removed/changed for an entity, we would do our best to sync everything up across the hierarchy.</p> +<p>However this meant that for a given point in time, the hierarchy could be &quot;out of sync&quot; and incorrect.</p> +<p>Our solution to this problem is to remove the deferred &quot;hierarchy maintenance system&quot; in favor of making hierarchy changes &quot;transactional&quot;. Hierarchy changes are now done via transactional <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Commands.html"><code>Commands</code></a>, and directly modifying the component fields individually is no longer possible. This ensures that for a given point in time, the hierarchy is &quot;correct&quot;.</p> +<p>For most Bevy developers this is a non-breaking change, as most hierarchies are already constructed using <code>with_children</code> commands:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SpatialBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">parent</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + parent<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + texture<span class="z-punctuation z-separator z-rust">:</span> player_texture<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + parent<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + texture<span class="z-punctuation z-separator z-rust">:</span> hat_texture<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>However for logic that adds/removes child entities from parents at runtime, the following commands must be used:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> removes the given children from the parent +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_parent</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">remove_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>child1<span class="z-punctuation z-separator z-rust">,</span> child2<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> pushes the given children to the &quot;end&quot; of the parent&#39;s Children list +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_parent</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">push_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>child3<span class="z-punctuation z-separator z-rust">,</span> child4<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> inserts the given children into the parent&#39;s Children list at the given index +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_parent</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>child5<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>We've also added <a href="https://docs.rs/bevy/0.8.0/bevy/hierarchy/enum.HierarchyEvent.html"><code>HierarchyEvent</code></a>, which makes it possible for developers to track changes in the hierarchy.</p> +<p>There are still a couple of small holes to close, but staying on the &quot;happy path&quot; is much easier now:</p> +<ul> +<li>removing only one of the components is possible (although heavily discouraged)</li> +<li>adding default values of only one of the components manually is still possible (although heavily discouraged)</li> +</ul> +<p>We're discussing ways to resolve this class of problem, such as <a href="https://github.com/bevyengine/bevy/issues/1481">Archetype Rules / Invariants</a>.</p> +<h2 id="bevy-reflection-improvements">Bevy Reflection Improvements +<a class="anchor-link" href="#bevy-reflection-improvements">#</a> +</h2> +<p>Bevy's &quot;Rust reflection&quot; system <code>bevy_reflect</code> is a core, foundational piece of Bevy's scene system. It provides a way to dynamically interact with Rust types at run-time without knowing their actual types. We've invested heavily in it this release to prepare for scripting support and scene system improvements.</p> +<p><a href="https://crates.io/crates/bevy_reflect"><code>bevy_reflect</code></a> aims to be a &quot;generic&quot; Rust reflection system. It can be used without Bevy. We believe it fills a very real gap in the Rust ecosystem and we encourage the wider Rust community to use it (and contribute!).</p> +<h3 id="untyped-reflection">&quot;Untyped&quot; Reflection +<a class="anchor-link" href="#untyped-reflection">#</a> +</h3> +<div class="release-feature-authors">authors: @jakobhellermann</div> +<p>The <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> derives now automatically add a new <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/struct.ReflectFromPtr.html"><code>ReflectFromPtr</code></a> struct to the <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/struct.TypeRegistry.html"><code>TypeRegistry</code></a> for each reflected type. This enables using the new <a href="https://bevyengine.org/news/bevy-0-8/#scripting-and-modding-progress-untyped-ecs-apis">untyped ECS apis</a> in combination with the reflection system. This helps enable things like 3rd party scripting and modding.</p> +<h3 id="default-trait-reflection">Default Trait Reflection +<a class="anchor-link" href="#default-trait-reflection">#</a> +</h3> +<div class="release-feature-authors">authors: @jakobhellermann</div> +<p>It is now possible to construct <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> types using their <a href="https://doc.rust-lang.org/std/default/trait.Default.html"><code>Default</code></a> trait impl, provided they register it as part of the <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> derive:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect<span class="z-punctuation z-separator z-rust">,</span> Default</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">reflect</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Default</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyStruct</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">foo</span><span class="z-punctuation z-separator z-type z-rust">:</span> String, + <span class="z-variable z-other z-member z-rust">bar</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">usize</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-storage z-type z-rust">let</span> registration <span class="z-keyword z-operator z-assignment z-rust">=</span> type_registry<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">TypeId<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">of<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyStruct<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> reflect_default <span class="z-keyword z-operator z-assignment z-rust">=</span> registration<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">data<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ReflectDefault<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This contains a MyStruct instance with default values +</span><span class="z-storage z-type z-rust">let</span> my_struct<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn Reflect<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> reflect_default<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This enables constructing components for entities without <em>any</em> compile time information, which is useful for dynamic scenarios like scripting and scenes.</p> +<h3 id="array-reflection">Array Reflection +<a class="anchor-link" href="#array-reflection">#</a> +</h3> +<div class="release-feature-authors">authors: @NathanSWard, @MrGVSV</div> +<p>Bevy's reflection system now supports reflecting Rust arrays, which can be interacted with in a type-erased manner using the new <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Array.html"><code>Array</code></a> trait.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Sprite</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">position</span><span class="z-punctuation z-separator z-type z-rust">:</span> [<span class="z-storage z-type z-rust">f32</span>; 2], +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-storage z-type z-rust">let</span> sprite <span class="z-keyword z-operator z-assignment z-rust">=</span> Sprite <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + position<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">1</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">2</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-storage z-type z-rust">let</span> position <span class="z-keyword z-operator z-assignment z-rust">=</span> sprite<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">field</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>position<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-path z-rust">ReflectRef<span class="z-punctuation z-accessor z-rust">::</span></span>Array<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>array</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> position<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">reflect_ref</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> x <span class="z-keyword z-operator z-assignment z-rust">=</span> array<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>x<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">downcast_ref<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<h3 id="static-typeinfo">Static TypeInfo +<a class="anchor-link" href="#static-typeinfo">#</a> +</h3> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>The <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> trait provides dynamic access to a <em>specific instance</em> of a type, but some scenarios (such as deserializing) benefit from knowing type information <em>before</em> we have an instance of a type. This opens the doors to building a Reflect-based <code>serde</code> alternative (or at the very least, a serde-less Bevy Scene deserializer).</p> +<p><strong>Bevy 0.8</strong> adds the ability to retrieve <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/enum.TypeInfo.html"><code>TypeInfo</code></a> for any type implementing <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Foo</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">a</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">f32</span>, + <span class="z-variable z-other z-member z-rust">b</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">usize</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-storage z-type z-rust">let</span> info <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">Foo<span class="z-punctuation z-accessor z-rust">::</span></span>type_info<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-path z-rust">TypeInfo<span class="z-punctuation z-accessor z-rust">::</span></span>Struct<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>info</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> info <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>info<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">is<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Foo<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>info<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">type_name</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">std<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">any<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">type_name<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Foo<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>info<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">field</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>a<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">is<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>info<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">field_at</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">is<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">usize</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>Note that <code>type_info()</code> returns <code>&amp;'static TypeInfo</code>: it will lazily allocate and store <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/enum.TypeInfo.html"><code>TypeInfo</code></a> the first time it is requested, then reuse that on each subsequent request.</p> +<p>Generic types also support <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/enum.TypeInfo.html"><code>TypeInfo</code></a>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-generic z-rust"><span class="z-entity z-name z-struct z-rust">Foo</span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>T<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span></span><span class="z-meta z-struct z-rust"> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">value</span><span class="z-punctuation z-separator z-type z-rust">:</span> T +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-storage z-type z-rust">let</span> info <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">Foo<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>type_info<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-path z-rust">TypeInfo<span class="z-punctuation z-accessor z-rust">::</span></span>Struct<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>info</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> info <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>info<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">field</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">is<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<h3 id="resource-reflection">Resource Reflection +<a class="anchor-link" href="#resource-reflection">#</a> +</h3> +<div class="release-feature-authors">authors: @Shatur</div> +<p>Bevy ECS resources can now be reflected:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">reflect</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Resource</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Scoreboard</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">points</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">usize</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>This registers a <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/reflect/struct.ReflectResource.html"><code>ReflectResource</code></a> in the <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/struct.TypeRegistry.html"><code>TypeRegistry</code></a> entry for the type, enabling type-erased read/write operations for the resource in an ECS <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/world/struct.World.html"><code>World</code></a>.</p> +<h3 id="pretty-reflect-debug-formatting">Pretty Reflect Debug Formatting +<a class="anchor-link" href="#pretty-reflect-debug-formatting">#</a> +</h3> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>&quot;Debug printing&quot; <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> references now provides pretty / useful outputs.</p> +<p>Consider the following example:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Foo</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">a</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">f32</span>, + <span class="z-variable z-other z-member z-rust">b</span><span class="z-punctuation z-separator z-type z-rust">:</span> Bar, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Bar</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">x</span><span class="z-punctuation z-separator z-type z-rust">:</span> String, + <span class="z-variable z-other z-member z-rust">y</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">usize</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +<span class="z-storage z-type z-rust">let</span> foo <span class="z-keyword z-operator z-assignment z-rust">=</span> Foo <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + a<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">42.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + b<span class="z-punctuation z-separator z-rust">:</span> Bar <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + x<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>hello<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + y<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">123</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-storage z-type z-rust">let</span> foo_reflect<span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>dyn Reflect <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>foo<span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{:#?}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> foo_reflect<span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>In previous versions of Bevy, this would have printed:</p> +<pre data-lang="txt" class="language-txt z-code"><code class="language-txt" data-lang="txt"><span class="z-text z-plain">Reflect(my_crate::Foo) +</span></code></pre> +<p>In <strong>Bevy 0.8</strong>, it prints:</p> +<pre data-lang="txt" class="language-txt z-code"><code class="language-txt" data-lang="txt"><span class="z-text z-plain">my_crate::Foo { + a: 42.0, + b: my_crate::Bar { + x: &quot;hello&quot;, + y: 123, + }, +} +</span></code></pre> +<p>Much better!</p> +<h3 id="bevy-reflect-internal-refactors">bevy_reflect Internal Refactors +<a class="anchor-link" href="#bevy-reflect-internal-refactors">#</a> +</h3> +<div class="release-feature-authors">authors: @MrGVSV, @PROMETHIA-27, @jakobhellermann</div> +<p>Now that <code>bevy_reflect</code> is starting to get some serious investment and usage, we've invested time in reworking the internals to make them easier to maintain and extend:</p> +<ul> +<li><strong><a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> Derive Reorganization</strong>: the derive logic was broken up into smaller, more maintainable pieces. &quot;Metadata structs&quot; were added to collect and organize derive inputs. (<code>@MrGVSV</code>)</li> +<li><strong>The <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> trait is now safe to implement</strong>: Soundness no longer hinges on the implementor doing the right thing, thanks to some changes to the <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> interface. As a result, we were able to remove the <code>unsafe</code> keyword from the <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> trait. (<code>@PROMETHIA-27</code>)</li> +<li><code>Serialize</code> logic is now implemented using <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/struct.TypeRegistry.html"><code>TypeRegistry</code></a> type data like other reflected trait logic, rather than being hard-coded into <a href="https://docs.rs/bevy/0.8.0/bevy/reflect/trait.Reflect.html"><code>Reflect</code></a> impls. (<code>@jakobhellermann</code>)</li> +</ul> +<h2 id="render-world-extract">Render World Extract +<a class="anchor-link" href="#render-world-extract">#</a> +</h2> +<div class="release-feature-authors">authors: @DJMcNab, @cart</div> +<p>Note: The renderer APIs discussed here are for developers of advanced custom rendering features and core Bevy renderer developers. If this seems verbose or the intent is confusing, don't worry!</p> +<p>Bevy's <a href="/news/bevy-0-6/#the-new-bevy-renderer">new renderer</a> &quot;extracts&quot; data needed for rendering from the &quot;main&quot; Bevy app, which enables parallel <a href="/news/bevy-0-6/#pipelined-rendering-extract-prepare-queue-render">pipelined rendering</a>. To facilitate this, in previous versions of Bevy we made the ECS <a href="https://docs.rs/bevy/0.8.0/bevy/render/enum.RenderStage.html#variant.Extract"><code>RenderStage::Extract</code></a> &quot;special&quot; (and more than a little bit weird). Systems in that stage ran on the &quot;main&quot; app world, but applied the system <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Commands.html"><code>Commands</code></a> to the &quot;render&quot; app world.</p> +<p>This accomplished the goal, but it:</p> +<ol> +<li><strong>Was confusing</strong>: render feature developers had to &quot;know&quot; that this stage behaved differently from the other &quot;normal&quot; ECS stages in the schedule. Implicitly, <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Commands.html"><code>Commands</code></a> behaved differently and the ECS data access was &quot;flipped&quot;. Using &quot;normal&quot; entity spawning apis <em>would not work as expected</em> because the <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Commands.html"><code>Commands</code></a> parameter internally still used the main app's Entities collection.</li> +<li><strong>Prevented parallelism</strong>: directly modifying existing &quot;render world&quot; resources required exclusive access to <code>ResMut&lt;RenderWorld&gt;</code>, which prevented these systems from running in parallel. Making this access parallel required unnecessary allocations using <a href="https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Commands.html"><code>Commands</code></a>, which for &quot;large&quot; (or incrementally updated) extractions was inefficient.</li> +</ol> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old: Bevy 0.7 (limited parallelism) +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">extract_score</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">score</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Score<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">render_world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>RenderWorld<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-operator z-arithmetic z-rust">*</span>render_world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">resource_mut<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ExtractedScore<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">ExtractedScore<span class="z-punctuation z-accessor z-rust">::</span></span>from<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>score</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old: Bevy 0.7 (unnecessary allocations / prevents incremental updates) +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">extract_score</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, <span class="z-variable z-parameter z-rust">score</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Score<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">ExtractedScore<span class="z-punctuation z-accessor z-rust">::</span></span>from<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>score</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>In <strong>Bevy 0.8</strong>, we've made the extract stage &quot;normal&quot;. It runs directly on the &quot;render world&quot;, just like the other render app stages. To &quot;extract&quot; data from the main app world, just wrap the relevant system parameters in the new <a href="https://docs.rs/bevy/0.8.0/bevy/render/struct.Extract.html"><code>Extract</code></a> type to retrieve that parameter from the main app world instead:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New: Bevy 0.8 (parallel and not weird!) +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">extract_score</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">extracted_score</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ExtractedScore<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">score</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Extract<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Score<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-operator z-arithmetic z-rust">*</span>extracted_score <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">ExtractedScore<span class="z-punctuation z-accessor z-rust">::</span></span>from<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>score</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>The extract system is now parallel, the data access is consistent with other renderer ECS stages, and the intent of the system is clearer.</p> +<h2 id="extractresource-trait-and-plugin">ExtractResource Trait and Plugin +<a class="anchor-link" href="#extractresource-trait-and-plugin">#</a> +</h2> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p>Some ECS resources have very simple extract logic:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">extract_cool_color</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">extracted_cool_color</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>CoolColor<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">cool_color</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Extract<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>CoolColor<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-operator z-arithmetic z-rust">*</span>extracted_cool_color <span class="z-keyword z-operator z-assignment z-rust">=</span> cool_color<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Rather than force developers to write this out manually, <strong>Bevy 0.8</strong> now provides the <a href="https://docs.rs/bevy/0.8.0/bevy/render/extract_resource/trait.ExtractResource.html"><code>ExtractResource</code></a> trait / derive:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">ExtractResource<span class="z-punctuation z-separator z-rust">,</span> Clone</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">CoolColor</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">color</span><span class="z-punctuation z-separator z-type z-rust">:</span> Color, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Then, just add the <a href="https://docs.rs/bevy/0.8.0/bevy/render/extract_resource/struct.ExtractResourcePlugin.html"><code>ExtractResourcePlugin&lt;CoolColor&gt;</code></a> to your <a href="https://docs.rs/bevy/0.8.0/bevy/app/struct.App.html"><code>App</code></a> and the resource will be automatically extracted.</p> +<p><a href="https://docs.rs/bevy/0.8.0/bevy/render/extract_resource/trait.ExtractResource.html"><code>ExtractResource</code></a> can also be implemented manually if you need custom logic (or the type needs to change):</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">ExtactResource <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">ExtractedCoolColor</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-type z-rust">type</span> <span class="z-entity z-name z-type z-rust">Source</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> CoolColor<span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">extract_resource</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">source</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>CoolColor</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> <span class="z-storage z-type z-rust">Self</span></span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">Self</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + color<span class="z-punctuation z-separator z-rust">:</span> source<span class="z-punctuation z-accessor z-dot z-rust">.</span>color<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">as_rgba_linear</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="taffy-migration-a-refreshed-ui-layout-library">Taffy migration: a refreshed UI layout library +<a class="anchor-link" href="#taffy-migration-a-refreshed-ui-layout-library">#</a> +</h2> +<div class="release-feature-authors">authors: @alice-i-cecile, @jkelleyrtp, @Weibye, @TimJentzsch, @colepoirier</div> +<p>Bevy's moved off the abandoned <a href="https://crates.io/crates/stretch"><code>stretch</code></a> UI layout crate and onto its new community-maintained hard fork: <a href="https://crates.io/crates/taffy"><code>taffy</code></a>. Together with the <a href="https://dioxuslabs.com/">Dioxus</a> team, we've dramatically cleaned up the code base, solved a critical performance issue with deep UI trees and freshened up the docs.</p> +<p>We're looking forward to its continued maintenance and development as the team continues to improve its performance, fix bugs, and add support for alternative layout paradigms.</p> +<h2 id="ecs-soundness-correctness-improvements">ECS Soundness / Correctness Improvements +<a class="anchor-link" href="#ecs-soundness-correctness-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @TheRawMeatball, @BoxyUwU, @SkiFire13, @jakobhellermann</div> +<p>Bevy ECS received a solid number of soundness and correctness bug fixes this release:</p> +<ul> +<li><strong>Removed <code>EntityMut::get_unchecked</code></strong>: The only way to soundly use this API is already encapsulated within <code>EntityMut::get</code>. Therefore there was no reason to keep this unsafe API around.</li> +<li><strong>Fixed unsoundness with some <code>Or</code>/<code>AnyOf</code>/<code>Option</code> component access</strong>: Previous Bevy versions allowed unsound versions of these queries. We now properly prevent those uses.</li> +<li><strong>Improve soundness of <code>CommandQueue</code></strong>: It is now sound to store Commands with padding or uninitialized bytes. A &quot;use after move&quot; case was also removed.</li> +<li><strong>Fix some memory leaks detected by Miri</strong>: Miri detected a case that leaks in our <code>BlobVec</code> drop impl. That is now fixed.</li> +<li><strong>Lint for missing SAFETY comments in <code>bevy_ecs</code></strong>: We now require safety comments for unsafe code blocks in <code>bevy_ecs</code>.</li> +</ul> +<p>As Bevy ECS matures, our bar for unsafe code blocks and soundness must also mature. Bevy ECS will probably never be 100% free of unsafe code blocks because we are modeling parallel data access that Rust cannot reason about without our help. But we are committed to both removing as much unsafe code as we can and improving the quality of the unsafe code that remains.</p> +<h2 id="android-progress-we-aren-t-there-yet-but-we-re-closer">Android Progress: We aren't there yet, but we're closer! +<a class="anchor-link" href="#android-progress-we-aren-t-there-yet-but-we-re-closer">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>Bevy now &quot;kind of&quot; runs on Android again!</p> +<p>However Android support <em>is not</em> ready yet. There are issues with how we manage render contexts that must be resolved that sometimes break rendering at startup and <em>always</em> break rendering when apps are minimized. Audio also doesn't work yet.</p> +<p>Here is the <code>load_gltf</code> Bevy example running on my Pixel 6:</p> +<p><img src="https://bevyengine.org/news/bevy-0-8/android.png" alt="android" /></p> +<p>That being said, this is an important step forward, as Bevy developers can now build, deploy, (and in some cases test) Bevy apps on Android!</p> +<p>If you are itching to test Bevy on mobile platforms, our <a href="https://github.com/bevyengine/bevy/blob/v0.8.0/examples/README.md#ios">iOS support</a> is much more polished. Bevy developers have already started <a href="https://noumenal.app/">publishing Bevy-based iOS apps to the Apple App Store</a>!</p> +<h2 id="ci-build-system-improvements">CI / Build System Improvements +<a class="anchor-link" href="#ci-build-system-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf, @NiklasEi</div> +<p>As always, Bevy's CI had plenty of improvements this cycle:</p> +<ul> +<li>Examples are now run in WASM when validating builds. Screenshots are taken and stored as part of the build outputs to ensure rendering works (<code>@mockersf</code>).</li> +<li>The Bevy examples are now run on a Windows VM once per day to ensure they aren't broken (<code>@mockersf</code>).</li> +<li>License files are now automatically added to all published crates (<code>@NiklasEi</code>).</li> +<li>There is now a workflow to automatically generate a PR with version number bumps for all Bevy crates (<code>@mockersf</code>).</li> +<li>To make the occasional nightly Rust breakage less disruptive, we've parameterized the nightly toolchain to make it easier to pin to a specific nightly. (<code>@mockersf</code>)</li> +</ul> +<h2 id="example-post-processing">Example: Post Processing +<a class="anchor-link" href="#example-post-processing">#</a> +</h2> +<div class="release-feature-authors">authors: @Vrixyz</div> +<p>We've added a new example that shows how to use the new <a href="https://bevyengine.org/news/bevy-0-8/#camera-driven-rendering">Camera Driven Rendering</a> and <a href="https://bevyengine.org/news/bevy-0-8/#new-material-system">Shader Materials</a> to build a &quot;chromatic aberration&quot; post processing effects using a full screen quad and &quot;render to texture&quot;.</p> +<p><img src="https://bevyengine.org/news/bevy-0-8/post_processing.png" alt="post processing" /></p> +<p>We plan on building more formal post processing APIs in future releases, but this approach is relatively straightforward and opens up a lot of doors. Much simpler than extending the lower level <a href="https://docs.rs/bevy/0.8.0/bevy/render/render_graph/struct.RenderGraph.html"><code>RenderGraph</code></a>!</p> +<p>Run it by cloning the Bevy repo and running <code>cargo run --release --example post_processing</code>.</p> +<h2 id="example-many-animated-foxes">Example: Many Animated Foxes +<a class="anchor-link" href="#example-many-animated-foxes">#</a> +</h2> +<div class="release-feature-authors">authors: @superdump</div> +<p>This is a fun stress test of our <a href="/news/bevy-0-7/#skeletal-animation">Skeletal Animation System</a> that renders many animated foxes walking around in a circle.</p> +<p><img src="https://bevyengine.org/news/bevy-0-8/many_foxes.png" alt="many foxes" /></p> +<p>Run it by cloning the Bevy repo and running <code>cargo run --release --example many_foxes</code>.</p> +<h2 id="wasm-example-build-tool">WASM Example Build Tool +<a class="anchor-link" href="#wasm-example-build-tool">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>We've built a tool to make it easier to build and run Bevy's examples in your browser:</p> +<p>In the root of the Bevy repo, run the following command:</p> +<pre data-lang="sh" class="language-sh z-code"><code class="language-sh" data-lang="sh"><span class="z-source z-shell z-bash"><span class="z-meta z-function-call z-shell"><span class="z-variable z-function z-shell">cargo</span></span><span class="z-meta z-function-call z-arguments z-shell"> run<span class="z-variable z-parameter z-option z-shell"><span class="z-punctuation z-definition z-parameter z-shell"> -</span>p</span> build-wasm-example<span class="z-keyword z-operator z-end-of-options z-shell"> --</span></span><span class="z-meta z-function-call z-arguments z-shell"> lighting</span> +</span></code></pre> +<p>This will run the <code>cargo build</code> and <code>wasm-bindgen</code> commands, and place the output in the <code>examples/wasm</code> folder. Run your favorite &quot;local webserver&quot; command there, such as <code>python3 -m http.server</code> and open that url in your browser!</p> +<h2 id="website-improved-examples-page">Website: Improved Examples Page +<a class="anchor-link" href="#website-improved-examples-page">#</a> +</h2> +<div class="release-feature-authors">authors: @doup, @ickk</div> +<p>The <a href="/examples/">Bevy WASM Examples</a> pages have been reworked:</p> +<ul> +<li>They now display loading bars while Bevy App content and assets load</li> +<li>The design / layout of the page is now much nicer</li> +</ul> +<p><img src="https://bevyengine.org/news/bevy-0-8/examples_page.png" alt="examples page" /></p> +<h2 id="bevy-org-changes">Bevy Org Changes +<a class="anchor-link" href="#bevy-org-changes">#</a> +</h2> +<p>As Bevy grows, we are constantly re-evaluating our development process to accommodate an ever-increasing volume of development. We're long past the point where I can make every decision and I've been slowly delegating responsibilities as my trust in the knowledge and experience of our community members grows.</p> +<p>This release cycle, there were two major changes to the Bevy Org:</p> +<ol> +<li>All existing developers with &quot;delegated merge rights&quot; (<code>@mockersf</code> and <code>@alice-i-cecile</code>) now have the title &quot;maintainer&quot;.</li> +<li>Rob Swain (<code>@superdump</code>) is now a maintainer. You will probably recognize them from their work on Bevy's renderer. They've been a veritable force of nature, driving forward clustered forward rendering, directional and point light shadows, visibility / frustum culling, alpha blending, compressed GPU textures, and more. Rob has demonstrated deep understanding of rendering algorithms, Bevy internals, and Bevy project direction. I'm certainly looking forward to what they build next!</li> +</ol> +<p>Being a &quot;maintainer&quot; now works like this:</p> +<ol> +<li><strong>Maintainers now have no (hard) limits on the &quot;area&quot; of PRs they can merge</strong>. No more limits on &quot;docs only&quot;, &quot;rendering only&quot;, etc. It is now each maintainers' responsibility to evaluate their areas of comfort. This does increase risk to an extent, but I think it's an important step to allow maintainers to grow organically.</li> +<li><strong>Maintainers can merge &quot;relatively uncontroversial&quot; PRs with at least two community approvals</strong>. Maintainers will collectively decide and enforce what is uncontroversial. Controversial PRs should be labeled with the <code>S-Controversial</code> label. Note that &quot;two community approvals&quot; is the minimum requirement. Maintainers are responsible for ensuring the appropriate people have approved a PR.</li> +<li><strong>Maintainers can merge &quot;completely trivial&quot; PRs without two community approvals</strong>. Some examples of &quot;completely trivial&quot;: typo fixes, removing unused dependencies or code, and small &quot;API consistency&quot; fixes.</li> +<li><strong>Controversial Decision Making on a Timer</strong>: For all controversial PRs (including RFCs), if two maintainers approve, the PR can be labeled with a <code>S-Ready-For-Final-Review</code> label. As soon as this label is added and I have been pinged, a clock starts. If I have not responded with actionable feedback, a &quot;snooze button&quot; / &quot;we aren't ready for this yet&quot;, or a veto within a month and a half (45 days), maintainers are free to merge the PR. This gives me the ability to dictate project direction in areas where that is important while also empowering maintainers to move things forward in parallel when that makes sense. We will be calibrating this approach as we go to make sure we strike the right balance between progress, quality, and consistent vision.</li> +<li><strong>I still reserve the right to veto all code changes and make unilateral code changes</strong>. This includes reverting &quot;controversial changes&quot; merged via (4).</li> +</ol> +<p>We've used this process for most of the last cycle and I'm loving how it is working so far: more trust, more eyes on each decision, faster development velocity, no more trivial fixes sitting in limbo. I still get to enforce consistent vision when that matters, but the community is empowered to drive efforts forward.</p> +<h2 id="what-s-next">What's Next? +<a class="anchor-link" href="#what-s-next">#</a> +</h2> +<ul> +<li><strong>Post Processing</strong>: We have a lot of post processing work in the pipeline (some of it almost made it in to this release). The next release will make it easier to write post processing effects (thanks to intermediate HDR textures and a separate tonemapping step), and it will also include built-in effects like bloom and upscaling.</li> +<li><strong>Asset Preprocessing</strong>: We will be investing heavily in our asset pipeline, with a focus on: +<ol> +<li>Pre-processing assets to do expensive work &quot;during development time&quot;, so Bevy Apps can be deployed with assets that are prettier, smaller, and/or faster to load.</li> +<li>Enabling configuring assets with <code>.meta</code> files. For example, you could define a texture compression level, the filter it should use, or the target format.</li> +</ol> +</li> +<li><strong>Scene System Improvements</strong>: This release saw a lot of investment in Reflection. We can now build the next iteration of the scene system on top of it, with a nicer scene format, nested scenes, and improved workflows.</li> +<li><strong>Bevy UI Improvements</strong>: In preparation for the visual Bevy Editor, we will be improving the capabilities and user experince of Bevy UI.</li> +<li><strong>Bevy Jam #2</strong>: <a href="https://itch.io/jam/bevy-jam-1">Bevy Jam #1</a> was a massive success: 74 entries, 1,618 ratings, and lots of good community vibes. Now that <strong>Bevy 0.8</strong> is released, it's time to jam again! We'll release details on this soon. To stay in the loop, follow <a href="https://twitter.com/BevyEngine">@BevyEngine</a> on Twitter and join the <a href="https://discord.gg/bevy">Official Bevy Discord</a>.</li> +</ul> +<h2 id="support-bevy">Support Bevy +<a class="anchor-link" href="#support-bevy">#</a> +</h2> +<p>Sponsorships help make our work on Bevy sustainable. If you believe in Bevy's mission, consider sponsoring us ... every bit helps!</p> +<ul> +<li><strong><a href="https://github.com/sponsors/cart">Carter Anderson (@cart)</a></strong>: Full-time lead developer, project manager, and creator of Bevy. Focused on building out core engine systems, guiding project direction, and managing the community.</li> +<li><strong><a href="https://github.com/sponsors/alice-i-cecile">Alice Cecile (@alice-i-cecile)</a></strong>: Full-time technical project manager, mad scientist, and documentation lead. While she regularly leads expeditions into new domains, ECS will always be home base.</li> +<li><strong><a href="https://github.com/sponsors/mockersf">François Mockers (@mockersf)</a></strong>: CI whisperer. Making sure everything is running smoothly and improving Bevy one PR at a time.</li> +<li><strong>Rob Swain (@superdump)</strong>: Wielder of light. Turning data into shiny with massive parallelism. Currently hobby hacking so please donate to/sponsor the rest of the team. ❤️</li> +</ul> +<h2 id="contributors">Contributors +<a class="anchor-link" href="#contributors">#</a> +</h2> +<p>A huge thanks to the <strong>130 contributors</strong> that made this release (and associated docs) possible! In random order:</p> +<ul> +<li>@spooky-th-ghost</li> +<li>@afonsolage</li> +<li>@mlodato517</li> +<li>@ostwilkens</li> +<li>@mattwilkinsonn</li> +<li>@geckoxx</li> +<li>@SarthakSingh31</li> +<li>@zicklag</li> +<li>@teoxoy</li> +<li>@nsarlin</li> +<li>@HackerFoo</li> +<li>@elijaharita</li> +<li>@inact1v1ty</li> +<li>@bjorn3</li> +<li>@james-j-obrien</li> +<li>@Daniikk1012</li> +<li>@nihohit</li> +<li>@Ku95</li> +<li>@superdump</li> +<li>@dilyankostov</li> +<li>@SkiFire13</li> +<li>@edwardvear</li> +<li>@jakobhellermann</li> +<li>@KDecay</li> +<li>@TheRawMeatball</li> +<li>@fadhliazhari</li> +<li>@colepoirier</li> +<li>@brandon-reinhart</li> +<li>@Davier</li> +<li>@ManevilleF</li> +<li>@Bobox214</li> +<li>@RalfJung</li> +<li>@robtfm</li> +<li>@its-danny</li> +<li>@alice-i-cecile</li> +<li>@MonaMayrhofer</li> +<li>@yilinwei</li> +<li>@MrGVSV</li> +<li>@ickshonpe</li> +<li>@bzm3r</li> +<li>@nagisa</li> +<li>@fgiordana</li> +<li>@DJMcNab</li> +<li>@oliverpauffley</li> +<li>@64kramsystem</li> +<li>@alteous</li> +<li>@maniwani</li> +<li>@hoshino111</li> +<li>@Kanabenki</li> +<li>@JoJoJet</li> +<li>@x-52</li> +<li>@djeedai</li> +<li>@BoxyUwU</li> +<li>@MDeiml</li> +<li>@GarettCooper</li> +<li>@hymm</li> +<li>@mockersf</li> +<li>@nebkor</li> +<li>@2ne1ugly</li> +<li>@BGR360</li> +<li>@SUPERCILEX</li> +<li>@CGMossa</li> +<li>@infmagic2047</li> +<li>@CleanCut</li> +<li>@YoshieraHuang</li> +<li>@kornelski</li> +<li>@mdickopp</li> +<li>@SpecificProtagonist</li> +<li>@PROMETHIA-27</li> +<li>@eiei114</li> +<li>@Hoidigan</li> +<li>@Wcubed</li> +<li>@adsick</li> +<li>@nicopap</li> +<li>@siph</li> +<li>@C-BJ</li> +<li>@tamasfe</li> +<li>@object71</li> +<li>@LegNeato</li> +<li>@Elabajaba</li> +<li>@bytemuck</li> +<li>@AronDerenyi</li> +<li>@makspll</li> +<li>@cryscan</li> +<li>@NiklasEi</li> +<li>@grace125</li> +<li>@NathanSWard</li> +<li>@IceSentry</li> +<li>@Vrixyz</li> +<li>@Piturnah</li> +<li>@its-justus</li> +<li>@dataphract</li> +<li>@thomas992</li> +<li>@Olexorus</li> +<li>@ShadowCurse</li> +<li>@LoipesMas</li> +<li>@ImDanTheDev</li> +<li>@johanhelsing</li> +<li>@wrapperup</li> +<li>@james7132</li> +<li>@rebelroad-reinhart</li> +<li>@SuperSamus</li> +<li>@manokara</li> +<li>@Nilirad</li> +<li>@NeoRaider</li> +<li>@thebracket</li> +<li>@sarkahn</li> +<li>@MrPicklePinosaur</li> +<li>@Shatur</li> +<li>@themasch</li> +<li>@devil-ira</li> +<li>@fluunke</li> +<li>@DGriffin91</li> +<li>@aevyrie</li> +<li>@henryksloan</li> +<li>@bwasty</li> +<li>@MiniaczQ</li> +<li>@rparrett</li> +<li>@komadori</li> +<li>@ChristopherBiscardi</li> +<li>@dtaralla</li> +<li>@Sheepyhead</li> +<li>@TethysSvensson</li> +<li>@Neopallium</li> +<li>@FraserLee</li> +<li>@cart</li> +<li>@Obdzen</li> +<li>@oddfacade</li> +<li>@CAD97</li> +<li>@XBagon</li> +</ul> +<h2 id="full-change-log">Full Change Log +<a class="anchor-link" href="#full-change-log">#</a> +</h2> +<h3 id="added">Added +<a class="anchor-link" href="#added">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/4939">Callable PBR functions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4715">Spotlights</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4745">Camera Driven Rendering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4898">Camera Driven Viewports</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5310">Visibilty Inheritance, universal <code>ComputedVisibility</code>, and <code>RenderLayers</code> support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5053">Better Materials: <code>AsBindGroup</code> trait and derive, simpler <code>Material</code> trait</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5364">Derive <code>AsBindGroup</code> Improvements: Better errors, more options, update examples</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5312">Support <code>AsBindGroup</code> for 2d materials as well</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4489">Parallel Frustum Culling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4197">Hierarchy commandization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3872">Generate vertex tangents using mikktspace</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5344">Add a <code>SpatialBundle</code> with <code>Visibility</code> and <code>Transform</code> components</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3730">Add <code>RegularPolygon</code> and <code>Circle</code> meshes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2424">Add a <code>SceneBundle</code> to spawn a scene</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4833">Allow higher order systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2250">Add global <code>init()</code> and <code>get()</code> accessors for all newtyped <code>TaskPools</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4901">Add reusable shader functions for transforming position/normal/tangent</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4528">Add support for vertex colors</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5254">Add support for removing attributes from meshes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4999">Add option to center a window</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4904">Add <code>depth_load_op</code> configuration field to <code>Camera3d</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4948">Refactor <code>Camera</code> methods and add viewport rect</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5249">Add <code>TextureFormat::R16Unorm</code> support for <code>Image</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5335">Add a <code>VisibilityBundle</code> with <code>Visibility</code> and <code>ComputedVisibility</code> components</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3745">Add ExtractResourcePlugin</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4101">Add depth_bias to SpecializedMaterial</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4836">Added <code>offset</code> parameter to <code>TextureAtlas::from_grid_with_padding</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4048">Add the possibility to create custom 2d orthographic cameras</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3927">bevy_render: Add <code>attributes</code> and <code>attributes_mut</code> methods to <code>Mesh</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5151">Add helper methods for rotating <code>Transform</code>s</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5182">Enable wgpu profiling spans when using bevy's trace feature</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4240">bevy_pbr: rework <code>extract_meshes</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5119">Add <code>inverse_projection</code> and <code>inverse_view_proj</code> fields to shader view uniform</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5014">Add <code>ViewRangefinder3d</code> to reduce boilerplate when enqueuing standard 3D <code>PhaseItems</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4653">Create <code>bevy_ptr</code> standalone crate</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4692">Add <code>IntoIterator</code> impls for <code>&amp;Query</code> and <code>&amp;mut Query</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4447">Add untyped APIs for <code>Components</code> and <code>Resources</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4104">Add infallible resource getters for <code>WorldCell</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2539">Add <code>get_change_ticks</code> method to <code>EntityRef</code> and <code>EntityMut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4211">Add comparison methods to <code>FilteredAccessSet</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4423">Add <code>Commands::new_from_entities</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4841">Add <code>QueryState::get_single_unchecked_manual</code> and its family members</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4749">Add <code>ParallelCommands</code> system parameter</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4879">Add methods for querying lists of entities</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4942">Implement <code>FusedIterator</code> for eligible <code>Iterator</code> types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5066">Add <code>component_id()</code> function to <code>World</code> and <code>Components</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5136">Add ability to inspect entity's components</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5198">Add a more helpful error to help debug panicking command on despawned entity</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5148">Add <code>ExactSizeIterator</code> implementation for <code>QueryCombinatonIter</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5366">Added the <code>ignore_fields</code> attribute to the derive macros for <code>*Label</code> types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3863">Exact sized event iterators</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4693">Add a <code>clear()</code> method to the <code>EventReader</code> that consumes the iterator</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5355">Add helpers to send <code>Events</code> from <code>World</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2123">Add file metadata to <code>AssetIo</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4703">Add missing audio/ogg file extensions: .oga, .spx</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5106">Add <code>reload_asset</code> method to <code>AssetServer</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4618">Allow specifying chrome tracing file path using an environment variable</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4628">Create a simple tool to compare traces between executions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4709">Add a tracing span for run criteria</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4711">Add tracing spans for <code>Query::par_for_each</code> and its variants.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5011">Add a <code>release_all</code> method on <code>Input</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5015">Add a <code>reset_all</code> method on <code>Input</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4776">Add a helper tool to build examples for wasm</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4475">bevy_reflect: add a <code>ReflectFromPtr</code> type to create <code>&amp;dyn Reflect</code> from a <code>*const ()</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3733">Add a <code>ReflectDefault</code> type and add <code>#[reflect(Default)]</code> to all component types that implement Default and are user facing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4540">Add a macro to implement <code>Reflect</code> for struct types and migrate glam types to use this for reflection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4701">bevy_reflect: reflect arrays</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4790">bevy_reflect: reflect char</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4226">bevy_reflect: add <code>GetTypeRegistration</code> impl for reflected tuples</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5175">Add reflection for <code>Resources</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4350">bevy_reflect: add <code>as_reflect</code> and <code>as_reflect_mut</code> methods on <code>Reflect</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5201">Add an <code>apply_or_insert</code> method to <code>ReflectResource</code> and <code>ReflectComponent</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4108">bevy_reflect: <code>IntoIter</code> for <code>DynamicList</code> and <code>DynamicMap</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4217">bevy_reflect: Add <code>PartialEq</code> to reflected <code>f32</code>s and <code>f64</code>s</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4484">Create mutable versions of <code>TypeRegistry</code> methods</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4120">bevy_reflect: add a <code>get_boxed</code> method to <code>reflect_trait</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4140">bevy_reflect: add <code>#[reflect(default)]</code> attribute for <code>FromReflect</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4042">bevy_reflect: add statically available type info for reflected types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5275">Add an <code>assert_is_exclusive_system</code> function</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5225">bevy_ui: add a multi-windows check for <code>Interaction</code> (we dont yet support multiple windows)</a></li> +</ul> +<h3 id="changed">Changed +<a class="anchor-link" href="#changed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/4716">Depend on Taffy (a Dioxus and Bevy-maintained fork of Stretch)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3001">Use lifetimed, type erased pointers in bevy_ecs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4339">Migrate to <code>encase</code> from <code>crevice</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5168">Update <code>wgpu</code> to 0.13</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4621">Pointerfication followup: Type safety and cleanup</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4760">bevy_ptr works in no_std environments</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4736">Fail to compile on 16-bit platforms</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5343">Improve ergonomics and reduce boilerplate around creating text elements</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5389">Don't cull <code>Ui</code> nodes that have a rotation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4314">Rename <code>ElementState</code> to <code>ButtonState</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4285">Move <code>Size</code> to <code>bevy_ui</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4276">Move <code>Rect</code> to <code>bevy_ui</code> and rename it to <code>UiRect</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3592">Modify <code>FontAtlas</code> so that it can handle fonts of any size</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5234">Rename <code>CameraUi</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4705">Remove <code>task_pool</code> parameter from <code>par_for_each(_mut)</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4792">Copy <code>TaskPool</code> resoures to sub-Apps</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3575">Allow closing windows at runtime</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5227">Move the configuration of the <code>WindowPlugin</code> to a <code>Resource</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4726">Optionally resize <code>Window</code> canvas element to fit parent element</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5276">Change window resolution types from tuple to <code>Vec2</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4744">Update time by sending frame <code>Instant</code> through a channel</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4187">Split time functionality into <code>bevy_time</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4867">Split mesh shader files to make the shaders more reusable</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4824">Set <code>naga</code> capabilities corresponding to <code>wgpu</code> features</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4938">Separate out PBR lighting, shadows, clustered forward, and utils from pbr.wgsl</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5078">Separate PBR and tonemapping into 2 functions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4402">Make <code>RenderStage::Extract</code> run on the render world</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4465">Change default <code>FilterMode</code> of <code>Image</code> to <code>Linear</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4569">bevy_render: Fix KTX2 UASTC format mapping</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5222">Allow rendering meshes without UV coordinate data</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5259">Validate vertex attribute format on insertion</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4379">Use <code>Affine3A</code> for <code>GlobalTransform</code>to allow any affine transformation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4944">Recalculate entity <code>AABB</code>s when meshes change</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4663">Change <code>check_visibility</code> to use thread-local queues instead of a channel</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5049">Allow unbatched render phases to use unstable sorts</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5271">Extract resources into their target location</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5305">Enable loading textures of unlimited size</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4643">Do not create nor execute render passes which have no <code>PhaseItems</code> to draw</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4178">Filter material handles on extraction</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4812">Apply vertex colors to <code>ColorMaterial</code> and <code>Mesh2D</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4508">Make <code>MaterialPipelineKey</code> fields public</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4041">Simplified API to get NDC from camera and world position</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4658">Set <code>alpha_mode</code> based on alpha value</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4660">Make <code>Wireframe</code> respect <code>VisibleEntities</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4602">Use const <code>Vec2</code> in lights cluster and bounding box when possible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3906">Make accessors for mesh vertices and indices public</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4816">Use <code>BufferUsages::UNIFORM</code> for <code>SkinnedMeshUniform</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4085">Place origin of <code>OrthographicProjection</code> at integer pixel when using <code>ScalingMode::WindowSize</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3253">Make <code>ScalingMode</code> more flexible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5129">Move texture sample out of branch in <code>prepare_normal</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5212">Make the fields of the <code>Material2dKey</code> public</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5255">Use collect to build mesh attributes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4626">Replace <code>ReadOnlyFetch</code> with <code>ReadOnlyWorldQuery</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4909">Replace <code>ComponentSparseSet</code>'s internals with a <code>Column</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5170">Remove QF generics from all <code>Query/State</code> methods and types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4499">Remove <code>.system()</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3956">Make change lifespan deterministic and update docs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4650">Make derived <code>SystemParam</code> readonly if possible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4807">Merge <code>matches_archetype</code> and <code>matches_table</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5376">Allows conversion of mutable queries to immutable queries</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4773">Skip <code>drop</code> when <code>needs_drop</code> is <code>false</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4723">Use u32 over usize for <code>ComponentSparseSet</code> indicies</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4855">Remove redundant <code>ComponentId</code> in <code>Column</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5056">Directly copy moved <code>Table</code> components to the target location</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4503"><code>SystemSet::before</code> and <code>SystemSet::after</code> now take <code>AsSystemLabel</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2774">Converted exclusive systems to parallel systems wherever possible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4244">Improve <code>size_hint</code> on <code>QueryIter</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4160">Improve debugging tools for change detection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3922">Make <code>RunOnce</code> a non-manual <code>System</code> impl</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4677">Apply buffers in <code>ParamSet</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4725">Don't allocate for <code>ComponentDescriptors</code> of non-dynamic component types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5065">Mark mutable APIs under ECS storage as <code>pub(crate)</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5124">Update <code>ExactSizeIterator</code> impl to support archetypal filters (<code>With</code>, <code>Without</code>)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5167">Removed world cell from places where split multable access is not needed</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5159">Add Events to <code>bevy_ecs</code> prelude</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5231">Improve <code>EntityMap</code> API</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5306">Implement <code>From&lt;bool&gt;</code> for <code>ShouldRun</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5286">Allow iter combinations on custom world queries</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4957">Simplify design for <code>*Label</code>s</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4713">Tidy up the code of events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5383">Rename <code>send_default_event</code> to <code>send_event_default</code> on world</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5023">enable optional dependencies to stay optional</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5171">Remove the dependency cycles</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4794">Enforce type safe usage of Handle::get</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5359">Export anyhow::error for custom asset loaders</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5215">Update <code>shader_material_glsl</code> example to include texture sampling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5349">Remove unused code in game of life shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5274">Make the contributor birbs bounce to the window height</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5220">Improve Gamepad D-Pad Button Detection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5173">bevy_reflect: support map insertion</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4218">bevy_reflect: improve debug formatting for reflected types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4712">bevy_reflect_derive: big refactor tidying up the code</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4739">bevy_reflect: small refactor and default <code>Reflect</code> methods</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5010">Make <code>Reflect</code> safe to implement</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4782"><code>bevy_reflect</code>: put <code>serialize</code> into external <code>ReflectSerialize</code> type</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4780">Remove <code>Serialize</code> impl for <code>dyn Array</code> and friends</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4118">Re-enable <code>#[derive(TypeUuid)]</code> for generics</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4844">Move primitive type registration into <code>bevy_reflect</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5194">Implement reflection for more <code>glam</code> types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5210">Make <code>reflect_partial_eq</code> return more accurate results</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4655">Make public macros more robust with <code>$crate</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4717">Ensure that the parent is always the expected entity</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4708">Support returning data out of <code>with_children</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4547">Remove <code>EntityMut::get_unchecked</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4924">Diagnostics: meaningful error when graph node has wrong number of inputs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5339">Remove redundant <code>Size</code> import</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5324">Export and register <code>Mat2</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5291">Implement <code>Debug</code> for <code>Gamepads</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5269">Update codebase to use <code>IntoIterator</code> where possible.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5263">Rename <code>headless_defaults</code> example to <code>no_renderer</code> for clarity</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5190">Remove dead <code>SystemLabelMarker</code> struct</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5195">bevy_reflect: remove <code>glam</code> from a test which is active without the glam feature</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5187">Disable vsync for stress tests</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5174">Move <code>get_short_name</code> utility method from <code>bevy_reflect</code> into <code>bevy_utils</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5158">Derive <code>Default</code> for enums where possible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5048">Implement <code>Eq</code> and <code>PartialEq</code> for <code>MouseScrollUnit</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4668">Some cleanup for <code>bevy_ptr</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4189">Move float_ord from <code>bevy_core</code> to <code>bevy_utils</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4290">Remove unused <code>CountdownEvent</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4604">Some minor cleanups of asset_server</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4599">Use <code>elapsed()</code> on <code>Instant</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4445">Make paused <code>Timers</code> update <code>just_finished</code> on tick</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4580">bevy_utils: remove hardcoded log level limit</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4469">Make <code>Time::update_with_instant</code> public for use in tests</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4113">Do not impl Component for Task</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4541">Remove nonexistent <code>WgpuResourceDiagnosticsPlugin</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3624">Update ndk-glue requirement from 0.5 to 0.6</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4786">Update tracing-tracy requirement from 0.8.0 to 0.9.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4121">update image to 0.24</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4789">update xshell to 0.2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4848">Update gilrs to v0.9</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4991">bevy_log: upgrade to tracing-tracy 0.10.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5035">update hashbrown to 0.12</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5031">Update <code>clap</code> to 3.2 in tools using <code>value_parser</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5142">Updated <code>glam</code> to <code>0.21</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5396">Update Notify Dependency</a></li> +</ul> +<h3 id="fixed">Fixed +<a class="anchor-link" href="#fixed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/4494">bevy_ui: keep <code>Color</code> as 4 <code>f32</code>s</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5130">Fix issues with bevy on android other than the rendering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4689">Update layout/style when scale factor changes too</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3854">Fix <code>Overflow::Hidden</code> so it works correctly with <code>scale_factor_override</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4099">Fix <code>bevy_ui</code> touch input</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5055">Fix physical viewport calculation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5299">Minimally fix the known unsoundness in <code>bevy_mikktspace</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4608">Make <code>Transform</code> propagation correct in the presence of updated children</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4557"><code>StorageBuffer</code> uses wrong type to calculate the buffer size.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4457">Fix confusing near and far fields in Camera</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4527">Allow minimising window if using a 2d camera</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5039">WGSL: use correct syntax for matrix access</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5038">Gltf: do not import <code>IoTaskPool</code> in wasm</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5095">Fix skinned mesh normal handling in mesh shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5307">Don't panic when <code>StandardMaterial</code> <code>normal_map</code> hasn't loaded yet</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5300">Fix incorrect rotation in <code>Transform::rotate_around</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5301">Fix <code>extract_wireframes</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4636">Fix type parameter name conflicts of <code>#[derive(Bundle)]</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5137">Remove unnecessary <code>unsafe impl</code> of <code>Send+Sync</code> for <code>ParallelSystemContainer</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5348">Fix line material shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2029">Fix <code>mouse_clicked</code> check for touch</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4659">Fix unsoundness with <code>Or</code>/<code>AnyOf</code>/<code>Option</code> component access</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4863">Improve soundness of <code>CommandQueue</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4959">Fix some memory leaks detected by miri</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4076">Fix Android example icon</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/5009">Fix broken <code>WorldCell</code> test</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4890">Bugfix <code>State::set</code> transition condition infinite loop</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4900">Fix crash when using <code>Duration::MAX</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4871">Fix release builds: Move asserts under <code>#[cfg(debug_assertions)]</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4493">Fix frame count being a float</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4714">Fix &quot;unused&quot; warnings when compiling with <code>render</code> feature but without <code>animation</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2039">Fix re-adding a plugin to a <code>PluginGroup</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4520">Fix torus normals</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4949">Add <code>NO_STORAGE_BUFFERS_SUPPORT</code> shaderdef when needed</a></li> +</ul> + + + + Bevy 0.7 + 2022-04-15T00:00:00+00:00 + 2022-04-15T00:00:00+00:00 + + https://bevyengine.org/news/bevy-0-7/ + <p>Thanks to <strong>123</strong> contributors, <strong>349</strong> pull requests, and our <a href="https://github.com/sponsors/cart"><strong>generous sponsors</strong></a>, I'm happy to announce the <strong>Bevy 0.7</strong> release on <a href="https://crates.io/crates/bevy">crates.io</a>!</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out <a href="/learn/book/getting-started/">Quick Start Guide</a> to get started. Bevy is also free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. Check out <a href="https://bevyengine.org/assets">Bevy Assets</a> for a collection of community-developed plugins, games, and learning resources.</p> +<p>To update an existing Bevy App or Plugin to <strong>Bevy 0.7</strong>, check out our <a href="/learn/migration-guides/0.6-0.7/">0.6 to 0.7 Migration Guide</a>.</p> +<p>As always, there are a <em>ton</em> of new features, bug fixes, and quality of life tweaks in this release, but here are some of the highlights:</p> +<ul> +<li>Skeletal animation and mesh skinning</li> +<li>GLTF animation importing</li> +<li>Unlimited* point lights in a scene</li> +<li>Improved clustered forward rendering: dynamic/adaptive clustering and faster, more accurate cluster assignment</li> +<li>Compressed texture support (KTX2 / DDS / .basis): load more textures in a scene, faster</li> +<li>Compute shader / pipeline specialization: Bevy's flexible shader system was ported to compute shaders, enabling hot reloading, shader defs, and shader imports</li> +<li>Render to texture: cameras can now be configured to render to a texture instead of a window</li> +<li>Flexible mesh vertex layouts in shaders</li> +<li>ECS improvements: Order systems using their names, Query::many_mut, use conflicting parameters in systems via ParamSets, WorldQuery derives</li> +<li>Documentation improvements: better examples, more doc tests and more coverage</li> +<li>More audio control: pause, volume, speed, and looping</li> +<li>Power usage options to enable only updating Bevy Apps when input occurs</li> +</ul> +<span id="continue-reading"></span><h2 id="skeletal-animation">Skeletal Animation +<a class="anchor-link" href="#skeletal-animation">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132, @mockersf, @lassade, @Looooong</div> +<p>Bevy finally supports 3D skeletal animation!</p> +<p><video controls loop><source src="skeletal_animation.mp4" type="video/mp4"/></video></p> +<div style="font-size: 1.0rem" class="release-feature-authors">Scene Credits: <a href="https://skfb.ly/6TsvL">Tanabata evening - Kyoto inspired city scene</a> by Mathias Tossens is licensed under <a href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution</a>. Character model and animation are royalty free assets from Mixamo. +</div> +<p>Skeletal animations can now be played, paused, scrubbed, looped, reversed, and speed controlled using the new <a href="https://docs.rs/bevy/0.7.0/bevy/animation/struct.AnimationPlayer.html"><code>AnimationPlayer</code></a> component and <a href="https://docs.rs/bevy/0.7.0/bevy/animation/struct.AnimationClip.html"><code>AnimationClip</code></a> asset:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Animations</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">dance</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AnimationClip<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">start_dancing</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>Animations, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> AnimationPlayer<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>animations<span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-modifier z-rust">mut</span> animation_player</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + animation_player<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>animations<span class="z-punctuation z-accessor z-dot z-rust">.</span>dance<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p><a href="https://docs.rs/bevy/0.7.0/bevy/animation/struct.AnimationPlayer.html"><code>AnimationPlayer</code></a> can also be used to animate arbitrary <a href="https://docs.rs/bevy/0.7.0/bevy/transform/components/struct.Transform.html"><code>Transform</code></a> components, not just skeletons!</p> +<p>This critical feature has been a long time coming, but we wanted to build it in a way that meshed nicely with the <a href="/news/bevy-0-6/#the-new-bevy-renderer">new Bevy renderer</a> and didn't just &quot;hack things in&quot;. This builds on our new <a href="/news/bevy-0-7/#flexible-mesh-vertex-layouts">Flexible Mesh Vertex Layouts</a>, <a href="/news/bevy-0-6/#shader-imports">Shader Imports</a>, and <a href="/news/bevy-0-6/#materials">Material</a> systems, which ensures that this logic is flexible and reusable, even with non-standard meshes and custom render pipelines.</p> +<p>And we're just getting started! Multi-track animation blending and higher level animation state management should arrive in the very near future. Now is a great time to start contributing animation features to Bevy. We've smashed through most of the foundational technical hurdles and what remains is largely high level API design choices. We already have a couple of draft RFCs open in these areas: <a href="https://github.com/bevyengine/rfcs/pull/51">Animation Composition</a> and <a href="https://github.com/bevyengine/rfcs/pull/49">Animation Primitives</a>. Feel free to join the conversation!</p> +<h2 id="gltf-animation-importing">GLTF Animation Importing +<a class="anchor-link" href="#gltf-animation-importing">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>Bevy's GLTF importer was extended to import GLTF animations into the new <a href="https://docs.rs/bevy/0.7.0/bevy/animation/struct.AnimationPlayer.html"><code>AnimationPlayer</code></a> system. This supports both &quot;skeletal animation&quot; and arbitrary transform animations:</p> +<p><video controls loop><source src="fox.mp4" type="video/mp4"/></video></p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">FoxAnimations</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">walk</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AnimationClip<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">setup</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_scene</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>models/animated/Fox.glb#Scene0<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>FoxAnimations <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + walk<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>models/animated/Fox.glb#Animation0<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">play_on_load</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-variable z-parameter z-rust">animations</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>FoxAnimations<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> AnimationPlayer, <span class="z-meta z-generic z-rust">Added<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AnimationPlayer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> player <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + player<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>animations<span class="z-punctuation z-accessor z-dot z-rust">.</span>walk<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">repeat</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="unlimited-point-lights">Unlimited* Point Lights +<a class="anchor-link" href="#unlimited-point-lights">#</a> +</h2> +<div class="release-feature-authors">authors: Rob Swain (@superdump), @robtfm</div> +<p>Bevy can now render scenes with arbitrary numbers of point lights on platforms that support storage buffers (which is basically everything but WebGL). In the last Bevy release (0.6) we added <a href="/news/bevy-0-6/#clustered-forward-rendering">Clustered Forward Rendering</a>, which is a rendering technique that optimizes each fragment's light calculation costs by assigning lights to sub-volumes of the visible volume, called &quot;clusters&quot;. However in the interest of platform compatibility (WebGL), we initially limited ourselves to 256 lights because that is what fit in a uniform buffer binding.</p> +<p>In <strong>Bevy 0.7</strong>, we added the ability to automatically &quot;upgrade&quot; to using unbounded storage buffers for Clustered Forward Rendering on platforms that support them, enabling unlimited* point lights. There is an asterisk there because in practice this is limited by memory and hardware constraints.</p> +<h2 id="light-clustering-features-and-optimizations">Light Clustering Features and Optimizations +<a class="anchor-link" href="#light-clustering-features-and-optimizations">#</a> +</h2> +<div class="release-feature-authors">authors: Rob Swain (@superdump), @robtfm, @dataphract, @cart</div> +<p>With the upper limit of 256 point lights removed, the only limit on lights is what the hardware can support and bottlenecks in our algorithms. To increase the number of lights, we made a number of optimizations to our clustering algorithms.</p> +<ul> +<li><strong>Dynamic Light Clusters</strong> +<ul> +<li>By default cluster x/y slices are now dynamically configured based on the lights in the scene, which can significantly increase performance in some scenes.</li> +<li>The clustering behavior is now also user-configurable as FixedZ (the new default dynamic x/y behavior, fixing the number of z slices), custom fixed x/y/z slice values, single-cluster, and &quot;no clustering&quot;, giving you control when you know a certain cluster configuration will perform even better.</li> +<li>Additionally, in 0.6 the visible volume that is covered by all the clusters basically matched the full visible volume of the view frustum. This meant that if all the point lights were in the foreground, all the clusters beyond the lights were wasted space. In 0.7, it is possible to limit the far bound to be closer than the camera far bound, which means the lights can be spread across more clusters, which can significantly increase rendering performance.</li> +</ul> +</li> +<li><strong>Iterative Sphere Refinement</strong>: Bevy now uses the Just Cause 3 iterative sphere refinement approach to cluster assignment, which gives us a ~10% performance increase on some benchmarks and more accurate clustering (which can also improve render performance).</li> +<li><strong>Light Frustum Change Detection</strong>: We now use Bevy ECS's change detection feature to only recalculate the view frustum of lights that have changed.</li> +<li><strong>Cluster Assignment Optimizations</strong>: The cluster assignment data access patterns and data structures received a variety of tweaks that improved performance.</li> +</ul> +<p>Here is a video illustrating a progression from the old limit of 256 point lights to 25,000 point lights at 60fps!</p> +<p>(Note that the 25,000 lights example disables the debug light spheres to ensure that light calculations are the bottleneck)</p> +<p><video controls loop><source src="many_lights.mp4" type="video/mp4"/></video></p> +<p>And we have <a href="https://github.com/bevyengine/bevy/pull/4345">even more clustering optimizations</a> in the works!</p> +<h2 id="configurable-light-visibility">Configurable Light Visibility +<a class="anchor-link" href="#configurable-light-visibility">#</a> +</h2> +<div class="release-feature-authors">authors: @robtfm</div> +<p>Lights can now be turned on and off using Bevy's standard <a href="https://docs.rs/bevy/0.7.0/bevy/render/view/struct.Visibility.html"><code>Visibility</code></a> component:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PointLightBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + visibility<span class="z-punctuation z-separator z-rust">:</span> Visibility <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + is_visible<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-language z-rust">false</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="compressed-gpu-textures">Compressed GPU Textures +<a class="anchor-link" href="#compressed-gpu-textures">#</a> +</h2> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p>As scenes grow larger, so do their assets. Compressing these assets is a great way to save space. The Amazon Bistro scene featured below has well over 1GB of compressed textures.</p> +<p>PNG is a popular compressed format, but it must be decompressed before the GPU can use it. This can be a slow process for large scenes. Those textures are then used in their uncompressed form, taking up large quantities of limited memory. Compressed GPU textures can be used directly in their compressed format by the GPU and can be loaded without any additional processing. This reduces load times significantly. As they remain compressed, this also reduces RAM usage significantly.</p> +<p>The Bistro scene took a total of 12.9s to load with PNG textures, but only 1.5s with compressed textures - taking approximately a tenth of the load time! The total RAM usage was ~12GB with uncompressed textures, and 5GB with compressed textures, less than half!</p> +<p>The benefits don't stop there either - because the textures are compressed and can be used by the GPU in that format, reading from them uses less memory bandwidth, which can bring performance benefits. The Bistro scene gains about 10% in frame rate from using compressed textures.</p> +<p><img src="https://bevyengine.org/news/bevy-0-7/bistro_compressed.png" alt="bistro compressed" /></p> +<p>Another benefit is that mipmaps are supported, which makes for smoother, less noisy textures. Bevy currently doesn't have support for automatically generating mipmaps for uncompressed textures, so using compressed textures is a nice way to have mipmaps now!</p> +<p>In summary, Bevy now supports loading compressed textures from <code>.dds</code>, <code>.ktx2</code>, and <code>.basis</code> files. This includes support for the standard ASTC, BCn, and ETC2 formats, as well as 'universal' formats like ETC1S and UASTC that can be transcoded to the standard formats supported by specific systems at runtime. The glTF loader was also extended to support loading these formats.</p> +<p>These features can be enabled using the <code>dds</code>, <code>ktx2</code>, and <code>basis-universal</code> cargo features.</p> +<h2 id="render-to-texture">Render To Texture +<a class="anchor-link" href="#render-to-texture">#</a> +</h2> +<div class="release-feature-authors">authors: @HackerFoo</div> +<p>Bevy now has initial support for rendering to texture by configuring the <code>render_target</code> field on <code>Camera</code>. This enables scenarios such as mirrors, split screen, 2d UI in 3d space, portals, etc.</p> +<p><video controls loop><source src="render_to_texture.mp4" type="video/mp4"/></video></p> +<p>Note that the current implementation is relatively low level. It will generally require interacting with Bevy's Render Graph and defining new camera types. If you would like to use this feature now, the <a href="https://github.com/bevyengine/bevy/blob/main/examples/3d/render_to_texture.rs">render_to_texture example</a> illustrates the steps required. We have plans for <a href="https://github.com/bevyengine/bevy/discussions/4191">&quot;high level render targets&quot;</a> that will make rendering to textures possible in just a few lines of code. Stay tuned for details!</p> +<h2 id="bevy-native-compute-shaders">Bevy-Native Compute Shaders +<a class="anchor-link" href="#bevy-native-compute-shaders">#</a> +</h2> +<div class="release-feature-authors">authors: @Ku95</div> +<p>Bevy's flexible asset-driven shader system was ported to compute shaders/pipelines, enabling hot reloading, <a href="https://bevyengine.org/news/bevy-0-6/#shader-preprocessor">shader defs</a>, <a href="https://bevyengine.org/news/bevy-0-6/#shader-imports">shader imports</a>, and <a href="https://bevyengine.org/news/bevy-0-6/#pipeline-specialization">pipeline specialization</a> based on user-configurable keys:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-operator z-rust">#</span>import <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>shaders/game_of_life_texture_bind_group.wgsl<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span> + +<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>compute</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-function z-rust">workgroup_size</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">8</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">8</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">game_of_life_update</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span>[[builtin<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-variable z-parameter z-rust">global_invocation_id</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span>]] <span class="z-variable z-parameter z-rust">invocation_id</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">vec3<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> location <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-generic z-rust">vec2<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">i32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">i32</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>invocation_id<span class="z-punctuation z-accessor z-dot z-rust">.</span>x</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-type z-rust">i32</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>invocation_id<span class="z-punctuation z-accessor z-dot z-rust">.</span>y</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-storage z-type z-rust">let</span> alive <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-function z-rust">is_location_alive</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>location</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> shader defs are configurable at runtime, prompting new variants of the shader to be compiled +</span><span class="z-keyword z-operator z-rust">#</span>ifdef <span class="z-constant z-other z-rust">WRITE_OUTPUT</span> + storageBarrier<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + textureStore<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>texture<span class="z-punctuation z-separator z-rust">,</span> location<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">f32</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>alive</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-operator z-rust">#</span>endif +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="flexible-mesh-vertex-layouts">Flexible Mesh Vertex Layouts +<a class="anchor-link" href="#flexible-mesh-vertex-layouts">#</a> +</h2> +<div class="release-feature-authors">authors: @cart, @parasyte</div> +<p>In <strong>Bevy 0.7</strong>, it is now easy to make shaders support any Mesh vertex layout and arbitrary vertex attributes. Bevy's &quot;shader pipeline specialization&quot; system was extended to support &quot;specializing on mesh vertex layouts&quot;.</p> +<p>For most Bevy users, this means that <a href="/news/bevy-0-6/#materials">Materials</a>, including the built in <a href="https://docs.rs/bevy/0.7.0/bevy/pbr/struct.StandardMaterial.html"><code>StandardMaterial</code></a> and custom shader materials now support arbitrary Meshes automatically, provided those Meshes have the vertex attributes required by the material shaders. It also means that if your Mesh is missing any attribute required by its material, rendering can fail gracefully.</p> +<p>We also made use of this system to implement joint weights and indices for our new <a href="/news/bevy-0-7/#skeletal-animation">Skeletal Animation</a> implementation.</p> +<p>For Bevy users that like to write lower level graphics pipelines, this feature makes it possible to easily and efficiently specialize your pipelines according to Mesh vertex layouts:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">SpecializedMeshPipeline <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">SomeCustomPipeline</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-type z-rust">type</span> <span class="z-entity z-name z-type z-rust">Key</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> SomeCustomKey<span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">specialize</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-variable z-parameter z-rust">self</span>, + <span class="z-variable z-parameter z-rust">key</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust"><span class="z-storage z-type z-rust"><span class="z-storage z-type z-rust">Self</span><span class="z-punctuation z-accessor z-rust">::</span></span></span>Key, + <span class="z-variable z-parameter z-rust">layout</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>MeshVertexBufferLayout, + </span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Result</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>RenderPipelineDescriptor, SpecializedMeshPipelineError<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this is a layout that matches the requirements requested, +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> but catered to whatever mesh is currently being rendered +</span> <span class="z-storage z-type z-rust">let</span> vertex_buffer_layout <span class="z-keyword z-operator z-assignment z-rust">=</span> layout<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_layout</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> + <span class="z-meta z-path z-rust">Mesh<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">ATTRIBUTE_POSITION</span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">at_shader_location</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">Mesh<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">ATTRIBUTE_NORMAL</span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">at_shader_location</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">Mesh<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">ATTRIBUTE_UV_0</span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">at_shader_location</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">2</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-keyword z-operator z-rust">?</span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-support z-type z-rust">Ok</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>RenderPipelineDescriptor <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + vertex<span class="z-punctuation z-separator z-rust">:</span> VertexState <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + buffers<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>vertex_buffer_layout<span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> define the rest of the vertex state here <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> define the rest of the mesh pipeline here <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></span></span></code></pre> +<h2 id="camera-marker-components">Camera Marker Components +<a class="anchor-link" href="#camera-marker-components">#</a> +</h2> +<div class="release-feature-authors">authors: @jakobhellermann</div> +<p>In <strong>Bevy 0.7</strong>, Cameras now use the &quot;marker component&quot; pattern to determine the &quot;camera type&quot; (ex: 3D, 2D, UI), rather than using string names.</p> +<p>This means that it is now cheaper and easier to select cameras of a specific type:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">move_3d_camera_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">transforms</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform, <span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Camera3d<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> camera <span class="z-keyword z-operator z-rust">in</span> transforms<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> move camera here +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="ergonomic-system-ordering">Ergonomic System Ordering +<a class="anchor-link" href="#ergonomic-system-ordering">#</a> +</h2> +<div class="release-feature-authors">authors: @cart, @aevyrie, @alice-i-cecile, @DJMcNab</div> +<p>Bevy uses &quot;labels&quot; to define ordering constraints between its ECS systems when they run in parallel. In previous versions of Bevy, the only way to order systems was to define custom labels:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">SystemLabel<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> Hash<span class="z-punctuation z-separator z-rust">,</span> Debug<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Eq</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">UpdateVelocity</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>update_velocity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>UpdateVelocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>UpdateVelocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>In <strong>Bevy 0.7</strong>, manually defining labels is no longer required. You can order systems using functions, just like you do when adding systems!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>update_velocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>update_velocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This is accomplished by &quot;auto-labeling&quot; systems with their <a href="https://doc.rust-lang.org/std/any/struct.TypeId.html"><code>TypeId</code></a> (the label type is <a href="https://docs.rs/bevy/0.7.0/bevy/ecs/system/struct.SystemTypeIdLabel.html"><code>SystemTypeIdLabel</code></a>). Internally ordering still uses labels.</p> +<p>The Bevy ECS labeling system is powerful and there are still legitimate use cases for custom labels (such as labeling multiple systems with the same label and exporting a stable public API as a plugin author). But most common use cases can take advantage of the ergonomic auto-labeling functionality.</p> +<h2 id="default-shorthand">Default Shorthand +<a class="anchor-link" href="#default-shorthand">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>Bevy makes heavy use of Rust's <a href="https://doc.rust-lang.org/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax">struct update pattern</a> in combination with the <code>Default</code> trait when initializing entities. This significantly reduces the amount of typing required by enabling developers to only fill in the fields they want to change.</p> +<p>The standard way of doing this is to write out <code>..Default::default()</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + texture<span class="z-punctuation z-separator z-rust">:</span> some_texture<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This is much better than filling in each field's component manually:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + texture<span class="z-punctuation z-separator z-rust">:</span> some_texture<span class="z-punctuation z-separator z-rust">,</span> + sprite<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + transform<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + global_transform<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + visibility<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>However this can feel repetitive when you're doing it for tens or hundreds of entities. We added a way to make this even easier, without needing to resort to macros:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + texture<span class="z-punctuation z-separator z-rust">:</span> some_texture<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This is equivalent in functionality to <code>..Default::default()</code>, it's just more compressed. And you can still use the longer form if you prefer. The <code>default()</code> function is included in Bevy's prelude, so you don't need to manually import it. Ergonomics for the win!</p> +<h2 id="query-many">Query::many +<a class="anchor-link" href="#query-many">#</a> +</h2> +<div class="release-feature-authors">authors: @alice-i-cecile</div> +<p>Bevy ECS solves a hard problem: providing easy and fast access to data in parallel while still respecting Rust's strict mutability and ownership rules. Since our first release, we've supported efficiently accessing specific entities in our ECS Queries:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">SomeEntities</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">a</span><span class="z-punctuation z-separator z-type z-rust">:</span> Entity, + <span class="z-variable z-other z-member z-rust">b</span><span class="z-punctuation z-separator z-type z-rust">:</span> Entity, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">entities</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEntities<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> a_transform <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>a</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>However, to respect Rust's mutability rules, we need to disallow apis that might produce &quot;aliased mutability&quot;. Seasoned Bevy users will probably recognize this Rust borrow checker error:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">entities</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEntities<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> a_transform <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>a</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This line fails to compile because `query` is already mutably borrowed above +</span> <span class="z-storage z-type z-rust">let</span> b_transform <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p><em>You</em> know Entity A and Entity B are different entities at runtime. But Rust's borrow checker has no way to know that at compile time! I'm sure you can imagine game development scenarios that would benefit from having mutable access to multiple components at the same time. This borrow checker restriction was a common pain point and the workarounds were ... not fun (using scopes to ensure conflicting accesses are dropped, copying data, re-querying things, etc).</p> +<p>Fortunately, <strong>Bevy 0.7</strong> introduces a brand new set of apis to save the day!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">entities</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEntities<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Takes an array of entities and returns an array of mutable Query results +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This will panic if there are entity conflicts or the entities do not exist +</span> <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>a_transform<span class="z-punctuation z-separator z-rust">,</span> b_transform<span class="z-punctuation z-section z-group z-end z-rust">]</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">many_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>a<span class="z-punctuation z-separator z-rust">,</span> entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>b<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>There are plenty of variants:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Same as many_mut, but returns a Result instead of panicking +</span><span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Ok</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>a_transform<span class="z-punctuation z-separator z-rust">,</span> b_transform<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_many_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>a<span class="z-punctuation z-separator z-rust">,</span> entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>b<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> There are also immutable/read-only variants +</span><span class="z-storage z-type z-rust">let</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>a_transform<span class="z-punctuation z-separator z-rust">,</span> b_transform<span class="z-punctuation z-section z-group z-end z-rust">]</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">many</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>a<span class="z-punctuation z-separator z-rust">,</span> entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>b<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Ok</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>a_transform<span class="z-punctuation z-separator z-rust">,</span> b_transform<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_many</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>a<span class="z-punctuation z-separator z-rust">,</span> entities<span class="z-punctuation z-accessor z-dot z-rust">.</span>b<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>And they all support arbitrary numbers of entities:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>a<span class="z-punctuation z-separator z-rust">,</span> b<span class="z-punctuation z-separator z-rust">,</span> c<span class="z-punctuation z-section z-group z-end z-rust">]</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">many</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>entity_a<span class="z-punctuation z-separator z-rust">,</span> entity_b<span class="z-punctuation z-separator z-rust">,</span> entity_c<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="paramsets">ParamSets +<a class="anchor-link" href="#paramsets">#</a> +</h2> +<div class="release-feature-authors">authors: @bilsen</div> +<p>To prevent aliased mutability, Bevy ECS disallows systems that have parameters that conflict with each other. For example, if two Queries both request write access to the same component in the same &quot;archetype&quot;, that could result in aliased mutable access, so Bevy disallows that system and errors out.</p> +<p>Previous versions of Bevy supported conflicting Queries in the same system using QuerySets, which only allow access to one Query in the set at a time:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> These queries could each return a mutable A component for the same entity, so they must be put in a set to be considered a valid system. +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">set</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">QuerySet<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">QueryState<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A, <span class="z-keyword z-operator z-rust">&amp;</span>B<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-meta z-generic z-rust">QueryState<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A, <span class="z-keyword z-operator z-rust">&amp;</span>C<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> set<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">q0</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p><strong>Bevy 0.7</strong> removes <code>QuerySet</code> in favor of <code>ParamSet</code>, which generalizes the QuerySet pattern for <em>any</em> system parameter:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">set</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ParamSet<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A, <span class="z-keyword z-operator z-rust">&amp;</span>B<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A, <span class="z-keyword z-operator z-rust">&amp;</span>C<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> set<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">p0</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>But ParamSets aren't just limited to Queries! Consider this example, where the <code>EventWriter&lt;Jump&gt;</code> parameter (which internally accesses the <code>Events&lt;Jump&gt;</code> resource) conflicts with the raw access to that resource. Previously, expressing this wouldn't be possible. But with ParamSets, it is!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">set</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ParamSet<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">EventWriter<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Jump<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Events<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Jump<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> jump_event <span class="z-keyword z-operator z-rust">in</span> set<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">p1</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">drain</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>We still recommend avoiding ParamSets where possible for clarity's sake. But every so often they are a necessary and useful tool!</p> +<h2 id="deref-derefmut-derives">Deref / DerefMut Derives +<a class="anchor-link" href="#deref-derefmut-derives">#</a> +</h2> +<div class="release-feature-authors">authors: @MrGVSV</div> +<p>Rust encourages the use of the <a href="https://doc.rust-lang.org/rust-by-example/generics/new_types.html">newtype pattern</a> when expanding a type with new functionality or meaning. This is also a useful tool in Bevy:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Items</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Item<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">give_sword</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Items<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> items <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + items<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-support z-function z-rust">push</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Item<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Flaming Poisoning Raging Sword of Doom<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>This works just fine, but that <code>0</code> at the end of <code>items.0</code> sticks out like a sore thumb. Many of us in the Bevy Org think <code>.0</code> has no place in public apis. But the newtype pattern is still useful! Ideally, Rust would provide a way to express that <code>Items</code> is a new type, while transparently provided access to the <code>Vec&lt;Item&gt;</code> stored within. There are designs being discussed by the Rust team, but we don't want to wait for nice things!</p> +<p>Fortunately, the Deref / DerefMut traits in std provide the behavior we want. Users can already manually implement these traits, but for such a common pattern, we decided that providing our own trait derives was worth it. In <strong>Bevy 0.7</strong>, you can now derive Deref and DerefMut, enabling much nicer public apis:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component<span class="z-punctuation z-separator z-rust">,</span> Deref<span class="z-punctuation z-separator z-rust">,</span> DerefMut</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Items</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Item<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">give_sword</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Items<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> items <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> No more .0! +</span> items<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">push</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Item<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Flaming Poisoning Raging Sword of Doom<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Astute <code>std</code> doc readers might notice that the Rust team <a href="https://doc.rust-lang.org/std/ops/trait.Deref.html">recommends only using <code>Deref</code>/<code>DerefMut</code> for smart pointers, to avoid confusion</a>. Components like <code>Items</code> are <em>not</em> smart pointers. We choose to ignore this advice, as this pattern works, is already widely used in the Rust ecosystem, and Good UX Comes First.</p> +<h2 id="worldquery-derives">WorldQuery Derives +<a class="anchor-link" href="#worldquery-derives">#</a> +</h2> +<div class="release-feature-authors">authors: @mvlabat</div> +<p>Sometimes when building Bevy Apps you might find yourself repeating the same sets of components over and over in your queries:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">move_players</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Velocity, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> PlayerStats<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>transform<span class="z-punctuation z-separator z-rust">,</span> velocity<span class="z-punctuation z-separator z-rust">,</span> stats</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">player_gravity</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Entity, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Velocity, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> PlayerStats<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity<span class="z-punctuation z-separator z-rust">,</span> transform<span class="z-punctuation z-separator z-rust">,</span> velocity<span class="z-punctuation z-separator z-rust">,</span> stats</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Maybe you've gotten tired of typing the same components over and over. In <strong>Bevy 0.7</strong>, you can now easily create your own custom <a href="http://docs.rs/bevy/0.7.0/bevy/ecs/query/trait.WorldQuery.html"><code>WorldQuery</code></a> trait implementations with the <a href="http://docs.rs/bevy/0.7.0/bevy/ecs/query/trait.WorldQuery.html"><code>WorldQuery</code></a> derive:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">WorldQuery</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">world_query</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">mutable</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-generic z-rust"><span class="z-entity z-name z-struct z-rust">PlayerMovementQuery</span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;w</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span></span><span class="z-meta z-struct z-rust"> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">transform</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;w</span> <span class="z-storage z-modifier z-rust">mut</span> Transform, + <span class="z-variable z-other z-member z-rust">velocity</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;w</span> <span class="z-storage z-modifier z-rust">mut</span> Velocity, + <span class="z-variable z-other z-member z-rust">stats</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;w</span> <span class="z-storage z-modifier z-rust">mut</span> PlayerStats, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">move_players</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>PlayerMovementQuery<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> player <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">player_gravity</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Entity, PlayerMovementQuery<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity<span class="z-punctuation z-separator z-rust">,</span> player</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="world-resource">World::resource +<a class="anchor-link" href="#world-resource">#</a> +</h2> +<div class="release-feature-authors">authors: @alice-i-cecile</div> +<p>We've noticed that the majority of direct <a href="https://docs.rs/bevy/0.7.0/bevy/ecs/world/struct.World.html"><code>World</code></a> resource access immediately unwraps the results of <code>get_resource</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> time <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_resource<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>In <strong>Bevy 0.7</strong> we added an ergonomic variant that internally panics:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> time <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">resource<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>There is also a mutable variant:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> time <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">resource_mut<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>The <code>get_resource</code> variants are still available for cases where users still want to manually handle the returned <code>Option</code>.</p> +<h2 id="anyof-queries">AnyOf Queries +<a class="anchor-link" href="#anyof-queries">#</a> +</h2> +<div class="release-feature-authors">authors: @TheRawMeatball</div> +<p>Bevy ECS Queries now support <a href="http://docs.rs/bevy/0.7.0/bevy/ecs/query/struct.AnyOf.html"><code>AnyOf</code></a>, which will return results for entities that match &quot;any of&quot; the given component queries:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">AnyOf<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>A, <span class="z-keyword z-operator z-rust">&amp;</span>B<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Either A or B is guaranteed to be Some +</span> <span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">is_some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-logical z-rust">||</span> b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">is_some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>For the example above <a href="http://docs.rs/bevy/0.7.0/bevy/ecs/query/struct.AnyOf.html"><code>AnyOf</code></a> will return entities that have A and not B, B and not A, and both A and B.</p> +<h2 id="world-system-param">&amp;World System Param +<a class="anchor-link" href="#world-system-param">#</a> +</h2> +<div class="release-feature-authors">authors: @bilsen</div> +<p>It is now possible for &quot;normal systems&quot; have <code>&amp;World</code> system params, which provide full read-only access to the entire <a href="https://docs.rs/bevy/0.7.0/bevy/ecs/world/struct.World.html"><code>World</code></a>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>World, <span class="z-variable z-parameter z-rust">transforms</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Just keep in mind that <code>&amp;World</code> will conflict with <em>any</em> mutable Query:</p> +<div class="incorrect"> + <pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">invalid_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>World, <span class="z-variable z-parameter z-rust">transforms</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> + +</div> +<p>In these cases, consider using our new <a href="/news/bevy-0-7/#paramsets">ParamSets</a> to resolve the conflict:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">valid_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">set</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ParamSet<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>World, <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="ecs-soundness-correctness-improvements">ECS Soundness / Correctness Improvements +<a class="anchor-link" href="#ecs-soundness-correctness-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @BoxyUwU, @TheRawMeatball, @bjorn3</div> +<p>Bevy ECS received a solid number of soundness and correctness bug fixes this release:</p> +<ul> +<li>Removed unsound lifetime annotations on <code>EntityMut</code> and <code>Query</code>, which could be used to get aliased mutability in some situations.</li> +<li>Labeled <code>World::entities_mut</code> unsafe (because manually modifying entity metadata can invalidate safety assumptions)</li> +<li>Removed unsound <code>World::components_mut</code> (which allowed replacing component metadata, invalidating assumptions made elsewhere in World)</li> +<li>Fixed a <code>World::resource_scope</code> soundness bug</li> +<li>Used <code>ManuallyDrop</code> in resource id initialization instead of <code>forget()</code> to avoid invalidating a data pointer before it is used.</li> +</ul> +<p>We now also run the <a href="https://github.com/rust-lang/miri">miri</a> interpreter on Bevy ECS in our CI to help detect and prevent future soundness / correctness issues.</p> +<p>As Bevy ECS matures, our bar for unsafe code blocks and soundness must also mature. Bevy ECS will probably never be 100% free of unsafe code blocks because we are modeling parallel data access that Rust cannot reason about without our help. But we are committed to removing as much unsafe code as we can and improving the quality and scope of our unsafe code.</p> +<h2 id="audio-control">Audio Control +<a class="anchor-link" href="#audio-control">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>Bevy's audio system has been in a ... minimalist state since our first release. Until now, it only supported pressing &quot;play&quot; on audio assets. Third party plugins such as <a href="https://github.com/NiklasEi/bevy_kira_audio">bevy_kira_audio</a> have filled in the gaps with much more flexible audio solutions.</p> +<p>In <strong>Bevy 0.7</strong> we've started expanding what our built in audio plugin can do. It is now possible to pause, adjust volume, and set playback speed using <a href="http://docs.rs/bevy/0.7.0/bevy/audio/struct.AudioSink.html"><code>AudioSink</code></a> assets.</p> +<p>Playing audio now returns a <code>Handle&lt;AudioSink&gt;</code> which can be used to play/pause/set_speed/set_volume:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">BeautifulMusic</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AudioSink<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">setup_audio</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">audio</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Audio<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">audio_sinks</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AudioSink<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> music <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>BeautifulMusic.ogg<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> play audio and upgrade to a strong handle +</span> <span class="z-storage z-type z-rust">let</span> sink_handle <span class="z-keyword z-operator z-assignment z-rust">=</span> audio_sinks<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>audio<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>music</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>BeautifulMusic<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>sink_handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> later in another system +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">adjust_audio</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">music</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>BeautifulMusic<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">audio_sinks</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AudioSink<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>sink</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> audio_sinks<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>music<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> pause playback +</span> sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">pause</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> start playback again +</span> sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> increase the volume +</span> sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set_volume</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">volume</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-arithmetic z-rust">+</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> slow down playback +</span> sink<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set_speed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>You can also now loop audio playback:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">audio<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play_with_settings</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>music<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">PlaybackSettings<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">LOOP</span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_volume</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">75</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>We plan to continue iterating on these APIs with even more functionality and usability improvements!</p> +<h2 id="sprite-anchors">Sprite Anchors +<a class="anchor-link" href="#sprite-anchors">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p><a href="https://docs.rs/bevy/0.7.0/bevy/sprite/enum.Sprite.html"><code>Sprite</code></a> components can now define an <a href="https://docs.rs/bevy/0.7.0/bevy/sprite/enum.Anchor.html"><code>Anchor</code></a> point (also known as a &quot;pivot&quot; point), which determines the &quot;origin&quot; of the sprite. Sprites still default to a &quot;center&quot; origin, but this is now configurable:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + texture<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>bevy_logo.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + sprite<span class="z-punctuation z-separator z-rust">:</span> Sprite <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + anchor<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Anchor<span class="z-punctuation z-accessor z-rust">::</span></span>TopRight<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-function z-rust">default</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><video controls loop><source src="pivot.mp4" type="video/mp4"/></video></p> +<h2 id="eventloop-power-saving-modes">EventLoop Power Saving Modes +<a class="anchor-link" href="#eventloop-power-saving-modes">#</a> +</h2> +<div class="release-feature-authors">authors: @aevyrie</div> +<p>By default Bevy will run updates &quot;as fast as it can&quot; (limited by the screen's refresh rate). This is great for most games, but some application types (such as GUI apps) need to prioritize CPU and GPU power usage.</p> +<p><strong>Bevy 0.7</strong> adds the ability to configure the [<code>UpdateMode</code>] in [<code>WinitConfig</code>] to configure how Bevy Apps run updates:</p> +<ul> +<li><strong>Continuous</strong>: always update &quot;as soon as possible&quot; (honoring vsync configuration)</li> +<li><strong>Reactive</strong>: only update when there is a window event, a redraw is requested, or a configurable wait time has elapsed</li> +<li><strong>ReactiveLowPower</strong>: only update when there is user input (mouse movement, keyboard input, etc), a redraw is requested, or a configurable wait time has elapsed</li> +</ul> +<p>These settings can be configured separately for focused windows and unfocused windows (enabling you to save power when a window loses focus).</p> +<p><strong>ReactiveLowPower</strong> can <em>significantly</em> reduce power / resource usage, but it won't be suitable for every app type, as some apps need to assume that they are constantly being updated as quickly as possible. Therefore these settings are opt-in.</p> +<p>This app demos the various modes available. Note that Game mode was configured to lower its tick rate when it loses focus, which is not the default:</p> +<p><video controls loop><source src="power_settings.mp4" type="video/mp4"/></video></p> +<h2 id="documentation-improvements">Documentation improvements +<a class="anchor-link" href="#documentation-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @alice-i-cecile and many more</div> +<p>Great docs make learning, using and building Bevy better. +But as a young engine, they're still a work-in-progress.</p> +<h3 id="deny-missing-docs">deny-missing-docs +<a class="anchor-link" href="#deny-missing-docs">#</a> +</h3> +<p>Our docs team (led by <code>@alice-i-cecile</code>) has started to <a href="https://github.com/bevyengine/bevy/issues/3492">systematically fix that</a>, with the help of Rust's <code>#[warn(missing_docs)]</code> lint. +Since 0.6, we've fully documented (and prevented doc-regressions for):</p> +<ul> +<li><code>bevy_tasks</code> by <code>@james7132</code></li> +<li><code>bevy_app</code> by <code>@dbearden</code></li> +<li><code>bevy_dylib</code> by <code>@KDecay</code></li> +<li><code>bevy_internal</code> by <code>@sheepyhead</code></li> +</ul> +<p>There have been <a href="https://github.com/bevyengine/bevy/pulls?q=is%3Apr+is%3Aclosed+label%3AC-Docs">many other doc improvements</a> over this time period as well, including the addition of many helpful <a href="https://doc.rust-lang.org/rustdoc/documentation-tests.html">doc tests</a>, and our bar for docs in new code continues to rise. +A huge thanks to everyone making Bevy's docs better.</p> +<h3 id="new-contributors">New contributors +<a class="anchor-link" href="#new-contributors">#</a> +</h3> +<p>If you're <a href="https://github.com/bevyengine/bevy/blob/main/CONTRIBUTING.md">interested in contributing</a>, the docs team is always ready to help new contributors get their first Bevy PR merged ASAP. +There have been a <em>ton</em> of new contributors who've helped out with docs, either as a writer or a reviewer. +If this is you: thanks!</p> +<h3 id="better-examples">Better examples +<a class="anchor-link" href="#better-examples">#</a> +</h3> +<p>For many people, the best way to learn a tool is to see it in action. +We've been steadily polishing our <a href="https://github.com/bevyengine/bevy/tree/latest/examples">examples</a> with better explanations, more coverage, and higher code quality. +If you're new to Bevy, check out the much-improved <a href="https://github.com/bevyengine/bevy/blob/latest/examples/games/breakout.rs">Breakout example</a>!</p> +<h2 id="dev-docs">Dev Docs +<a class="anchor-link" href="#dev-docs">#</a> +</h2> +<div class="release-feature-authors">authors: @james7132, @mockersf, @aevyrie</div> +<p>We now automatically deploy Bevy's <code>main</code> development branch to <a href="https://dev-docs.bevyengine.org">https://dev-docs.bevyengine.org</a> whenever a change is merged. This will help Bevy documentation authors easily validate their changes. And &quot;bleeding edge&quot; Bevy users can learn about API changes we're working on.</p> +<p><img src="https://bevyengine.org/news/bevy-0-7/dev_docs.png" alt="dev docs" /></p> +<h2 id="website-improvements">Website Improvements +<a class="anchor-link" href="#website-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @doup</div> +<p>The <a href="/learn/book">Bevy Book</a> now has a much nicer pager widget that displays previous / next section names:</p> +<p><img src="https://bevyengine.org/news/bevy-0-7/pager.png" alt="pager" /></p> +<p>We also added an &quot;improve this page&quot; footer link to make it easier for Bevy Book readers to contribute changes.</p> +<p>The sidebar got an overhaul that improves clarity and makes it possible to open/close sections without clicking on them:</p> +<p><img src="https://bevyengine.org/news/bevy-0-7/sidebar.png" alt="sidebar" /></p> +<p>The responsiveness of the website has also been improved and some sections layout much better on mobile.</p> +<h2 id="scene-viewer-tool">Scene Viewer Tool +<a class="anchor-link" href="#scene-viewer-tool">#</a> +</h2> +<div class="release-feature-authors">authors: Rob Swain (@superdump), @mockersf, @IceSentry, @jakobhellermann</div> +<p>Bevy now has a dedicated scene viewer tool that can load arbitrary GLTF scene files. If you check out the main Bevy repo you can try it out by running:</p> +<pre data-lang="sh" class="language-sh z-code"><code class="language-sh" data-lang="sh"><span class="z-source z-shell z-bash"><span class="z-meta z-function-call z-shell"><span class="z-variable z-function z-shell">cargo</span></span><span class="z-meta z-function-call z-arguments z-shell"> run<span class="z-variable z-parameter z-option z-shell"><span class="z-punctuation z-definition z-parameter z-shell"> --</span>release</span><span class="z-variable z-parameter z-option z-shell"><span class="z-punctuation z-definition z-parameter z-shell"> --</span>example</span> scene_viewer /some/path/castle.gltf</span> +</span></code></pre> +<p>It has a built in &quot;fly camera&quot; and has tools to play animations and toggle lights and shadows.</p> +<p><img src="https://bevyengine.org/news/bevy-0-7/bevy_scene_viewer.png" alt="scene viewer" /></p> +<h2 id="support-bevy">Support Bevy +<a class="anchor-link" href="#support-bevy">#</a> +</h2> +<p>Sponsorships help make my full time work on Bevy sustainable. If you believe in Bevy's mission, consider sponsoring me (@cart) ... every bit helps!</p> +<p><a class="button button--pink header__cta" href="https://github.com/sponsors/cart">Donate <img class="button__icon" src="/assets/heart.svg" alt="heart icon"/></a></p> +<h2 id="contributors">Contributors +<a class="anchor-link" href="#contributors">#</a> +</h2> +<p>A huge thanks to the <strong>123 contributors</strong> that made this release (and associated docs) possible! In random order:</p> +<ul> +<li>@mfdorst</li> +<li>@devjobe</li> +<li>@PrototypeNM1</li> +<li>@devil-ira</li> +<li>@IsseW</li> +<li>@SuperSamus</li> +<li>@alice-i-cecile</li> +<li>@bilsen</li> +<li>@CooCooCaCha</li> +<li>@lufog</li> +<li>@chescock</li> +<li>@dbearden</li> +<li>@doup</li> +<li>@MiniaczQ</li> +<li>@C-BJ</li> +<li>@TedDriggs</li> +<li>@idanarye</li> +<li>@plof27</li> +<li>@robtfm</li> +<li>@ickk</li> +<li>@rsk700</li> +<li>@dataphract</li> +<li>@Looooong</li> +<li>@mdickopp</li> +<li>@bjorn3</li> +<li>@aloucks</li> +<li>@EpsilonDelphine</li> +<li>@rparrett</li> +<li>@CptPotato</li> +<li>@horvbalint</li> +<li>@jakobhellermann</li> +<li>@light4</li> +<li>@Lindenk</li> +<li>@rib</li> +<li>@ItsDoot</li> +<li>@KDecay</li> +<li>@p3rsik</li> +<li>@danieleades</li> +<li>@parasyte</li> +<li>@Sorck</li> +<li>@chenzhekl</li> +<li>@jch-13</li> +<li>@SecretPocketCat</li> +<li>@DJMcNab</li> +<li>@jak6jak</li> +<li>@ShadowCurse</li> +<li>@MrGVSV</li> +<li>@NiklasEi</li> +<li>@ZainlessBrombie</li> +<li>@lwansbrough</li> +<li>@ramon-bernardo</li> +<li>@aevyrie</li> +<li>@OptimisticPeach</li> +<li>@bitshifter</li> +<li>@glfmn</li> +<li>@rezural</li> +<li>@joshuataylor</li> +<li>@nakedible</li> +<li>@GarettCooper</li> +<li>@rand0m-cloud</li> +<li>@kirusfg</li> +<li>@oceantume</li> +<li>@l4desu-mizu</li> +<li>@fgiordana-netflix</li> +<li>@sarkahn</li> +<li>@Weasy666</li> +<li>@bytemuck</li> +<li>@james7132</li> +<li>@sseemayer</li> +<li>@pubrrr</li> +<li>@Sliman4</li> +<li>@geckoxx</li> +<li>@Bobox214</li> +<li>@mirkoRainer</li> +<li>@Veykril</li> +<li>@Gingeh</li> +<li>@pocket7878</li> +<li>@cart</li> +<li>@infmagic2047</li> +<li>@MinerSebas</li> +<li>@ramirezmike</li> +<li>@cjglo</li> +<li>@Sheepyhead</li> +<li>@L-french</li> +<li>@JoJoJet</li> +<li>@Wcubed</li> +<li>@Shatur</li> +<li>@reinismu</li> +<li>@boguscoder</li> +<li>@tversteeg</li> +<li>@TheRawMeatball</li> +<li>@mcobzarenco</li> +<li>@ezekg</li> +<li>@hlb8122</li> +<li>@B-Janson</li> +<li>@emersonmx</li> +<li>@mvlabat</li> +<li>@Nilirad</li> +<li>@jamesbeilby</li> +<li>@ryo33</li> +<li>@cdbfoster</li> +<li>@blaind</li> +<li>@fgiordana</li> +<li>@josh65536</li> +<li>@CleanCut</li> +<li>@tornewuff</li> +<li>@Ku95</li> +<li>@kcking</li> +<li>@luke-biel</li> +<li>@SUPERCILEX</li> +<li>@BoxyUwU</li> +<li>@TheAndrewJackson</li> +<li>@HackerFoo</li> +<li>@andresovela</li> +<li>@IceSentry</li> +<li>@RedlineTriad</li> +<li>@killercup</li> +<li>@Azorlogh</li> +<li>@superdump</li> +<li>@nebkor</li> +<li>@mockersf</li> +<li>@Gordon-F</li> +<li>@Jupp56</li> +</ul> +<h2 id="full-change-log">Full Change Log +<a class="anchor-link" href="#full-change-log">#</a> +</h2> +<h3 id="added">Added +<a class="anchor-link" href="#added">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/4238">Mesh Skinning</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4375">Animation Player</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3751">Gltf animations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3959">Mesh vertex buffer layouts</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3412">Render to a texture</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3884">KTX2/DDS/.basis compressed texture support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3948">Audio control - play, pause, volume, speed, loop</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4224">Auto-label function systems with SystemTypeIdLabel</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4298">Query::get_many</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3968">Dynamic light clusters</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4169">Always update clusters and remove per-frame allocations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2765"><code>ParamSet</code> for conflicting <code>SystemParam</code>:s</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4071">default() shorthand</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3635">use marker components for cameras instead of name strings</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2713">Implement <code>WorldQuery</code> derive macro</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2889">Implement AnyOf queries</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3979">Compute Pipeline Specialization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4047">Make get_resource (and friends) infallible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4433">bevy_pbr: Support flipping tangent space normal map y for DirectX normal maps</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4181">Faster view frustum culling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3989">Use storage buffers for clustered forward point lights</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2923">Add &amp;World as SystemParam</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4347">Add text wrapping support to Text2d</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4183">Scene Viewer to display glTF files</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3966">Internal Asset Hot Reloading</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3952">Add FocusPolicy to NodeBundle and ImageBundle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3656">Allow iter combinations on queries with filters</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3912">bevy_render: Support overriding wgpu features and limits</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3931">bevy_render: Use RenderDevice to get limits/features and expose AdapterInfo</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3974">Reduce power usage with configurable event loop</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3463">can specify an anchor for a sprite</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2969">Implement len and is_empty for EventReaders</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3945">Add more FromWorld implementations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4225">Add cart's fork of ecs_bench_suite</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4328">bevy_derive: Add derives for <code>Deref</code> and <code>DerefMut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3941">Add clear_schedule</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3090">Add Query::contains</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3048">bevy_render: Support removal of nodes, edges, subgraphs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3079">Implement init_resource for <code>Commands</code> and <code>World</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3328">Added method to restart the current state</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2935">Simplify sending empty events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2996">impl Command for &lt;impl FnOnce(&amp;mut World)&gt;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3739">Useful error message when two assets have the save UUID</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3643">bevy_asset: Add AssetServerSettings watch_for_changes member</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4088">Add conversio from Color to u32</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3917">Introduce <code>SystemLabel</code>'s for <code>RenderAssetPlugin</code>, and change <code>Image</code> preparation system to run before others</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4079">Add a helper for storage buffers similar to <code>UniformVec</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3982">StandardMaterial: expose a cull_mode option</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4056">Expose draw indirect</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3885">Add view transform to view uniform</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3696">Add a size method on Image.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3958">add Visibility for lights</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3711">bevy_render: Provide a way to opt-out of the built-in frustum culling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3675">use error scope to handle errors on shader module creation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3724">include sources in shader validation error</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4119">insert the gltf mesh name on the entity if there is one</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2154">expose extras from gltf nodes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4396">gltf: add a name to nodes without names</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3772">Enable drag-and-drop events on windows</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4170">Add transform hierarchy stress test</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3054">Add TransformBundle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3107">Add Transform::rotate_around method</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4399">example on how to create an animation in code</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2441">Add examples for Transforms</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4114">Add mouse grab example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4063">examples: add screenspace texture shader example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2636">Add generic systems example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2915">add examples on how to have a data source running in another thread / in a task pool thread</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3065">Simple 2d rotation example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2414">Add move sprite example.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2960">add an example using UI &amp; states to create a game menu</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4310">CI runs <code>cargo miri test -p bevy_ecs</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4182">Tracy spans around main 3D passes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3535">Add automatic docs deployment to GitHub Pages</a></li> +</ul> +<h3 id="changed">Changed +<a class="anchor-link" href="#changed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/3963">Proper prehashing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3976">Move import_path definitions into shader source</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4115">Make <code>System</code> responsible for updating its own archetypes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3923">Some small changes related to run criteria piping</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4340">Remove unnecessary system labels</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2382">Increment last event count on next instead of iter</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3817">Obviate the need for <code>RunSystem</code>, and remove it</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2982">Cleanup some things which shouldn't be components</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3633">Remove the config API</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3302">Deprecate <code>.system</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4250">Hide docs for concrete impls of Fetch, FetchState, and SystemParamState</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2434">Move the CoreStage::Startup to a seperate StartupSchedule label</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3565"><code>iter_mut</code> on Assets: send modified event only when asset is iterated over</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3560">check if resource for asset already exists before adding it</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4179">bevy_render: Batch insertion for prepare_uniform_components</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3981">Change default <code>ColorMaterial</code> color to white</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3803">bevy_render: Only auto-disable mappable primary buffers for discrete GPUs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3698">bevy_render: Do not automatically enable MAPPABLE_PRIMARY_BUFFERS</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4435">increase the maximum number of point lights with shadows to the max supported by the device</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4086">perf: only recalculate frusta of changed lights</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3984">bevy_pbr: Optimize assign_lights_to_clusters</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3930">improve error messages for render graph runner</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4428">Skinned extraction speedup</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4361">Sprites - keep color as 4 f32</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4055">Change scaling mode to FixedHorizontal</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3812">Replace VSync with PresentMode</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3617">do not set cursor grab on window creation if not asked for</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4180">bevy_transform: Use Changed in the query for much faster transform_propagate_system</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4168">Split bevy_hierarchy out from bevy_transform</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3045">Make transform builder methods const</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4126">many_cubes: Add a cube pattern suitable for benchmarking culling changes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4015">Make many_cubes example more interesting</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3849">Run tests (including doc tests) in <code>cargo run -p ci</code> command</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4246">Use more ergonomic span syntax</a></li> +</ul> +<h3 id="fixed">Fixed +<a class="anchor-link" href="#fixed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/4096">Remove unsound lifetime annotations on <code>EntityMut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4243">Remove unsound lifetime annotations on <code>Query</code> methods</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4092">Remove <code>World::components_mut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4093">unsafeify <code>World::entities_mut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2947">Use ManuallyDrop instead of forget in insert_resource_with_id</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3685">Backport soundness fix</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4194">Fix clicked UI nodes getting reset when hovering child nodes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3926">Fix ui interactions when cursor disappears suddenly</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3785">Fix node update</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4400">Fix derive(SystemParam) macro</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2838">SystemParam Derive fixes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4427">Do not crash if RenderDevice doesn't exist</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4383">Fixed case of R == G, following original conversion formula</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4035">Fixed the frustum-sphere collision and added tests</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3741">bevy_render: Fix Quad flip</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3795">Fix HDR asset support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4148">fix cluster tiling calculations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3697">bevy_pbr: Do not panic when more than 256 point lights are added the scene</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3916">fix issues with too many point lights</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4012">shader preprocessor - do not import if scope is not valid</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3603">support all line endings in shader preprocessor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4367">Fix animation: shadow and wireframe support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4417">add AnimationPlayer component only on scene roots that are also animation roots</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4376">Fix loading non-TriangleList meshes without normals in gltf loader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4270">gltf-loader: disable backface culling if material is double-sided</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/4006">Fix glTF perspective camera projection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3811">fix mul_vec3 transformation order: should be scale -&gt; rotate -&gt; translate</a></li> +</ul> + + + + Bevy 0.6 + 2022-01-08T00:00:00+00:00 + 2022-01-08T00:00:00+00:00 + + https://bevyengine.org/news/bevy-0-6/ + <p>Thanks to <strong>170</strong> contributors, <strong>623</strong> pull requests, and our <a href="https://github.com/sponsors/cart"><strong>generous sponsors</strong></a>, I'm happy to announce the <strong>Bevy 0.6</strong> release on <a href="https://crates.io/crates/bevy">crates.io</a>!</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out <a href="/learn/book/getting-started/">Quick Start Guide</a> to get started. Bevy is also free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. Check out <a href="https://bevyengine.org/assets">Bevy Assets</a> for a collection of community-developed plugins, games, and learning resources.</p> +<p>To update an existing Bevy App or Plugin to <strong>Bevy 0.6</strong>, check out our <a href="/learn/migration-guides/0.5-0.6/">0.5 to 0.6 Migration Guide</a>.</p> +<p>There are a <em>ton</em> of improvements, bug fixes and quality of life tweaks in this release. Here are some of the highlights:</p> +<ul> +<li>A brand new modern renderer that is prettier, faster, and simpler to extend</li> +<li>Directional and point light shadows</li> +<li>Clustered forward rendering</li> +<li>Frustum culling</li> +<li>Significantly faster sprite rendering with less boilerplate</li> +<li>Native WebGL2 support. You can test this out by <a href="/examples">running the Bevy Examples in your browser!</a></li> +<li>High level custom Materials</li> +<li>More powerful shaders: preprocessors, imports, WGSL support</li> +<li>Bevy ECS ergonomics and performance improvements. No more <code>.system()</code>!</li> +</ul> +<p>Read on for details!</p> +<span id="continue-reading"></span><h2 id="the-new-bevy-renderer">The New Bevy Renderer +<a class="anchor-link" href="#the-new-bevy-renderer">#</a> +</h2> +<p><strong>Bevy 0.6</strong> introduces a brand new modern renderer that is:</p> +<ul> +<li><strong>Faster</strong>: More parallel, less computation per-entity, more efficient CPU-&gt;GPU dataflow, and (with soon-to-be-enabled) pipelined rendering</li> +<li><strong>Prettier</strong>: We're releasing the new renderer alongside a number of graphical improvements, such as directional and point light shadows, clustered forward rendering (so you can draw more lights in a scene), and spherical area lights. We also have a ton of new features in development (cascaded shadow maps, bloom, particles, shadow filters, and more!)</li> +<li><strong>Simpler</strong>: Fewer layers of abstraction, simpler data flow, improved low-level, mid-level, and high-level interfaces, direct wgpu access</li> +<li><strong>Modular to its core</strong>: Standardized 2d and 3d core pipelines, extensible Render Phases and Views, composable entity/component-driven draw functions, shader imports, extensible and repeatable render pipelines via &quot;sub graphs&quot;</li> +<li><strong>Industry Proven</strong>: We've taken inspiration from battle tested renderer architectures, such as <a href="https://advances.realtimerendering.com/destiny/gdc_2015/Tatarchuk_GDC_2015__Destiny_Renderer_web.pdf">Bungie's pipelined Destiny renderer</a>. We also learned a lot from (and worked closely with) other renderer developers in the Rust space, namely @aclysma (<a href="https://github.com/aclysma/rafx">rafx</a>) and @cwfitzgerald (<a href="https://github.com/BVE-Reborn/rend3">rend3</a>). The New Bevy Renderer wouldn't be what it is without them, and I highly recommend checking out their projects!</li> +</ul> +<p>I promise I'll qualify all of those fluffy buzzwords below. I am confident that the New Bevy Renderer will be a rallying point for the Bevy graphics ecosystem and (hopefully) the Rust graphics ecosystem at large. We still have <em>plenty</em> of work to do, but I'm proud of what we have accomplished so far and I'm excited for the future!</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/bistro_day.png" alt="bistro day" /></p> +<h3 id="why-build-a-new-renderer">Why build a new renderer? +<a class="anchor-link" href="#why-build-a-new-renderer">#</a> +</h3> +<p>Before we cover what's new, it's worth discussing why we embarked on such a massive effort. The old Bevy Renderer got a number of things right:</p> +<ul> +<li><strong>Modular render logic</strong> (via the Render Graph)</li> +<li><strong>Multiple backends</strong> (both first and third party)</li> +<li><strong>High level data-driven API</strong>: this made it easy and ergonomic to write custom per-entity render logic</li> +</ul> +<p>However, it also had a number of <em>significant</em> shortcomings:</p> +<ul> +<li><strong>Complex</strong>: The &quot;high-level ease of use&quot; came at the cost of significant implementation complexity, performance overhead, and invented jargon. Users were often overwhelmed when trying to operate at any level but &quot;high-level&quot;. When managing &quot;render resources&quot;, it was easy to do something &quot;wrong&quot; and hard to tell &quot;what went wrong&quot;.</li> +<li><strong>Often slow</strong>: Features like &quot;sprite rendering&quot; were built on the costly high-level abstractions mentioned above. Performance was ... suboptimal when compared to other options in the ecosystem.</li> +<li><strong>User-facing internals</strong>: It stored a lot of internal render state directly on each entity. This took up space, computing the state was expensive, and it gunked up user-facing APIs with a bunch of &quot;do not touch&quot; render Components. This state (or at least, the component metadata) needed to be written to / read from Scenes, which was also suboptimal and error prone.</li> +<li><strong>Repeating render logic was troublesome</strong>: Viewports, rendering to multiple textures / windows, and shadow maps were possible, but they required hard-coding, special casing, and boilerplate. This wasn't aligned with our goals for modularity and clarity.</li> +</ul> +<h3 id="why-now">Why now? +<a class="anchor-link" href="#why-now">#</a> +</h3> +<p>The shortcomings above were acceptable in Bevy's early days, but were clearly holding us back as Bevy grew from a <a href="/news/introducing-bevy">one person side project</a> to the most popular Rust game engine on GitHub (and one of the most <a href="https://github.com/topics/game-engine">popular open source game engines ... period</a>). A &quot;passable&quot; renderer no longer cuts it when we have hundreds of contributors, a paid full-time developer, thousands of individual users, and a growing number of companies paying people to work on Bevy apps and features. It was time for a change.</p> +<p>For a deeper view into our decision-making and development process (including the alternatives we considered) check out the <a href="https://github.com/bevyengine/bevy/issues/2535">New Renderer Tracking Issue</a>.</p> +<h3 id="pipelined-rendering-extract-prepare-queue-render">Pipelined Rendering: Extract, Prepare, Queue, Render +<a class="anchor-link" href="#pipelined-rendering-extract-prepare-queue-render">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>Pipelined Rendering is a cornerstone of the new renderer. It accomplishes a number of goals:</p> +<ul> +<li><strong>Increased Parallelism</strong>: We can now start running the main app logic for the next frame, while rendering the current frame. Given that rendering is often a bottleneck, this can be a huge win when there is also a lot of app work to do.</li> +<li><strong>Clearer Dataflow and Structure</strong>: Pipelining requires drawing hard lines between &quot;app logic&quot; and &quot;render logic&quot;, with a fixed synchronization point (which we call the &quot;extract&quot; step). This makes it easier to reason about dataflow and ownership. Code can be organized along these lines, which improves clarity.</li> +</ul> +<p>From a high level, traditional &quot;non-pipelined rendering&quot; looks like this:</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/unpipelined_rendering.svg" alt="non-pipelined rendering" /></p> +<p>Pipelined rendering looks like this:</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/pipelined_rendering.svg" alt="pipelined rendering" /></p> +<p>Much better!</p> +<p>Bevy apps are now split into the Main App, which is where app logic occurs, and the Render App, which has its own separate ECS World and Schedule. The Render App consists of the following ECS stages, which developers add ECS Systems to when they are composing new render features:</p> +<ul> +<li><strong>Extract</strong>: This is the one synchronization point between the Main World and the Render World. Relevant Entities, Components, and Resources are read from the Main World and written to corresponding Entities, Components, and Resources in the Render World. The goal is to keep this step as quick as possible, as it is the one piece of logic that cannot run in parallel. It is a good rule of thumb to extract only the minimum amount of data needed for rendering, such as by only considering &quot;visible&quot; entities and only copying the relevant components.</li> +<li><strong>Prepare</strong>: Extracted data is then &quot;prepared&quot; by writing it to the GPU. This generally involves writing to GPU Buffers and Textures and creating Bind Groups.</li> +<li><strong>Queue</strong>: This &quot;queues&quot; render jobs that feed off of &quot;prepared&quot; data.</li> +<li><strong>Render</strong>: This runs the Render Graph, which produces actual render commands from the results stored in the Render World from the Extract, Prepare, and Queue steps.</li> +</ul> +<p>So pipelined rendering actually looks more like this, with the next app update occurring after the extract step:</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/pipelined_rendering_stages.svg" alt="pipelined rendering stages" /></p> +<p>As a quick callout, pipelined rendering doesn't <em>actually</em> happen in parallel yet. I <a href="https://github.com/cart/bevy/tree/actual-pipelining">have a branch</a> with parallel pipelining enabled, but running app logic in a separate thread currently breaks &quot;non send&quot; resources (because the main app is moved to a separate thread, breaking non send guarantees). There will be a fix for this soon, I just wanted to get the new renderer in peoples' hands as soon as possible! When we enable parallel pipelining, no user-facing code changes will be required.</p> +<h3 id="render-graphs-and-sub-graphs">Render Graphs and Sub Graphs +<a class="anchor-link" href="#render-graphs-and-sub-graphs">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p><img src="https://bevyengine.org/news/bevy-0-6/render_graph.svg" alt="render graph" /></p> +<p>The New Bevy Renderer has a Render Graph, <a href="/news/introducing-bevy/#render-graph">much like the old Bevy renderer</a>. Render Graphs are a way to logically model GPU command construction in a modular way. Graph Nodes pass GPU resources like Textures and Buffers (and sometimes Entities) to each other, forming a directed acyclic graph. When a Graph Node runs, it uses its graph inputs and the Render World to construct GPU command lists.</p> +<p>The biggest change to this API is that we now support Sub Graphs, which are basically &quot;namespaced&quot; Render Graphs that can be run from any Node in the graph with arbitrary inputs. This enables us to define things like a &quot;2d&quot; and &quot;3d&quot; sub graph, which users can insert custom logic into. This opens two doors simultaneously:</p> +<ul> +<li>The ability to repeat render logic, but for different views (split screen, mirrors, rendering to a texture, shadow maps).</li> +<li>The ability for users to extend this repeated logic.</li> +</ul> +<h3 id="embracing-wgpu">Embracing wgpu +<a class="anchor-link" href="#embracing-wgpu">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>Bevy has always used <a href="https://github.com/gfx-rs/wgpu">wgpu</a>, a native GPU abstraction layer with support for most graphics backends: Vulkan, Metal, DX12, OpenGL, WebGL2, and WebGPU (and WIP DX11 support). But the old renderer hid it behind our own hardware abstraction layer. In practice, this was largely just a mirror of the wgpu API. It gave us the ability to build our own graphics backends without bothering the wgpu folks, but in practice it created a lot of pain (due to being an imperfect mirror), overhead (due to introducing a dynamic API and requiring global mutex locks over GPU resource collections), and complexity (bevy_render -&gt; wgpu -&gt; Vulkan). In return, we didn't get many practical benefits ... just slightly more autonomy.</p> +<p>The truth of the matter is that wgpu already occupies <em>exactly</em> the space we want it to:</p> +<ul> +<li>Multiple backends, with the goal to support as many platforms as possible</li> +<li>A &quot;baseline&quot; feature set that works almost everywhere with a consistent API</li> +<li>A &quot;limits&quot; and &quot;features&quot; system that enables opting-in to arbitrary (sometimes backend-specific features) and detecting when those features are available. This will be important when we start adding things like raytracing and VR support.</li> +<li>A modern GPU API, but without the pain and complexity of raw Vulkan. Perfect for user-facing Bevy renderer extensions.</li> +</ul> +<p>However, initially there were a couple of reasons not to make it our &quot;public facing API&quot;:</p> +<ul> +<li><strong>Complexity</strong>: wgpu used to be built on top of gfx-hal (an older GPU abstraction layer also built and managed by the wgpu team). These multiple layers of abstraction in multiple repos made contributing to and reasoning about the internals difficult. Additionally, I have a rule for &quot;3rd party dependencies publicly exposed in Bevy APIs&quot;: we must feel comfortable forking and maintaining them if we need to (ex: upstream stops being maintained, visions diverge, etc). I wasn't particularly comfortable with doing that with the old architecture.</li> +<li><strong>Licensing</strong>: wgpu used to be licensed under the &quot;copyleft&quot; MPL license, which created concerns about integration with proprietary graphics apis (such as consoles like the Switch).</li> +<li><strong>WebGL2 Support</strong>: wgpu used to not have a WebGL2 backend. Bevy's old renderer had a custom WebGL2 backend and we weren't willing to give up support for the Web as a platform.</li> +</ul> +<p><em>Almost immediately</em> after we voiced these concerns, @kvark kicked off a <a href="https://github.com/gfx-rs/wgpu/issues/392">relicensing effort</a> that switched wgpu to the Rust-standard dual MIT/Apache-2.0 license. They also removed gfx-hal in favor of a <a href="https://gfx-rs.github.io/2021/08/18/release-0.10.html">much simpler and flatter architecture</a>. Soon after, @zicklag <a href="https://github.com/gfx-rs/wgpu/pull/1686">added a WebGL2 backend</a>. Having resolved all of my remaining hangups, it was clear to me that @kvark's priorities were aligned with mine and that I could trust them to adjust to community feedback.</p> +<p>The New Bevy Renderer tosses out our old intermediate GPU abstraction layer in favor of using wgpu directly as our &quot;low-level&quot; GPU API. The result is a simpler (and faster) architecture with full and direct access to wgpu. Feedback from Bevy Renderer feature developers so far has been <em>very positive</em>.</p> +<p>Bevy was also updated to use the latest and greatest wgpu version: <a href="https://github.com/gfx-rs/wgpu/blob/master/CHANGELOG.md#wgpu-012-2021-12-18">0.12</a>.</p> +<h3 id="ecs-driven-rendering">ECS-Driven Rendering +<a class="anchor-link" href="#ecs-driven-rendering">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>The new renderer is what I like to call &quot;ECS-driven&quot;:</p> +<ul> +<li>As we covered previously, the Render World is populated using data Extracted from the Main World.</li> +<li>Scenes are rendered from one or more Views, which are just Entities in the Render World with Components relevant to that View. View Entities can be extended with arbitrary Components, which makes it easy to extend the renderer with custom View data and logic. Cameras aren't the only type of View. Views can be defined by the Render App for arbitrary concepts, such as &quot;shadow map perspectives&quot;.</li> +<li>Views can have zero or more generic <code>RenderPhase&lt;T: PhaseItem&gt;</code> Components, where T defines the &quot;type and scope&quot; of thing being rendered in the phase (ex: &quot;transparent 3d entities in the main pass&quot;). At its core, a <code>RenderPhase</code> is a (potentially sorted) list of Entities to be drawn.</li> +<li>Entities in a RenderPhase are drawn using DrawFunctions, which read ECS data from the Render World and produce GPU commands.</li> +<li>DrawFunctions can (optionally) be composed of modular DrawCommands. These are generally scoped to specific actions like <code>SetStandardMaterialBindGroup</code>, <code>DrawMesh</code>, <code>SetItemPipeline</code>, etc. Bevy provides a number of built-in DrawCommands and users can also define their own.</li> +<li>Render Graph Nodes convert a specific View's RenderPhases into GPU commands by iterating each RenderPhases' Entities and running the appropriate Draw Functions.</li> +</ul> +<p>If that seems complicated ... don't worry! These are what I like to call &quot;mid-level&quot; renderer APIs. They provide the necessary tools for experienced render feature developers to build modular render plugins with relative ease. We also provide easy to use high-level APIs like Materials, which cover the majority of &quot;custom shader logic&quot; use cases.</p> +<h3 id="bevy-s-core-pipeline">Bevy's Core Pipeline +<a class="anchor-link" href="#bevy-s-core-pipeline">#</a> +</h3> +<div class="release-feature-authors">authors: @cart, Rob Swain (@superdump), @KirmesBude, @mockersf</div> +<p>The new renderer is <em>very</em> flexible and unopinionated by default. However, <em>too much</em> flexibility isn't always desirable. We want a rich Bevy renderer plugin ecosystem where developers have enough freedom to implement what they want, while still maximizing compatibility across plugins.</p> +<p>The new <code>bevy_core_pipeline</code> crate is our answer to this problem. It defines a &quot;core&quot; set of Views / Cameras (2d and 3d), Sub Graphs (ClearPass, MainPass2d, MainPass3d), and Render Phases (<code>Transparent2d</code>, <code>Opaque3d</code>, <code>AlphaMask3d</code>, <code>Transparent3d</code>). This provides a &quot;common ground&quot; for render feature developers to build on while still maintaining compatibility with each other. As long as developers operate within these constraints, they should be compatible with the wider ecosystem. Developers are also free to operate outside these constraints, but that also increases the likelihood that they will be incompatible.</p> +<p>Bevy's built-in render features build on top of the Core Pipeline (ex: <code>bevy_sprite</code> and <code>bevy_pbr</code>). The Core Pipeline will continue to expand with things like a standardized &quot;post-processing&quot; effect stack.</p> +<h3 id="materials">Materials +<a class="anchor-link" href="#materials">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>The new renderer structure gives developers fine-grained control over how entities are drawn. Developers can manually define Extract, Prepare, and Queue systems to draw entities using arbitrary render commands in custom or built-in + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_core_pipeline&#x2F;0.6.0&#x2F;bevy_core_pipeline/trait.RenderPhase.html"><code>RenderPhase</code></a>s. However this level of control necessitates understanding the render pipeline internals and involve more boilerplate than most users are willing to tolerate. Sometimes all you want to do is slot your custom material shader into the existing pipelines!</p> +<p>The new + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_pbr&#x2F;0.6.0&#x2F;bevy_pbr/trait.Material.html"><code>Material</code></a> trait enables users to ignore nitty gritty details in favor of a simpler interface: just implement the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_pbr&#x2F;0.6.0&#x2F;bevy_pbr/trait.Material.html"><code>Material</code></a> trait and add a + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_pbr&#x2F;0.6.0&#x2F;bevy_pbr/struct.MaterialPlugin.html"><code>MaterialPlugin</code></a> for your type. The new <a href="https://github.com/bevyengine/bevy/blob/v0.6.0/examples/shader/shader_material.rs">shader_material.rs</a> example illustrates this.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> register the plugin for a CustomMaterial +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugin</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">MaterialPlugin<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>CustomMaterial<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + +<span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">Material <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">CustomMaterial</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> the vertex and fragment shaders are optional +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> they use a default &quot;mesh pipeline shader&quot; if they are not defined +</span> <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">fragment_shader</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>AssetServer</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Option</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Shader<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>shaders/custom_material.wgsl<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">bind_group_layout</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">render_device</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>RenderDevice</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> BindGroupLayout</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> return bind group layout here <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">bind_group</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">render_asset</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">Self</span> <span class="z-keyword z-operator z-rust">as</span> RenderAsset<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>PreparedAsset</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> <span class="z-keyword z-operator z-rust">&amp;</span>BindGroup</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> return bind group here <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>There is also a + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_pbr&#x2F;0.6.0&#x2F;bevy_pbr/trait.SpecializedMaterial.html"><code>SpecializedMaterial</code></a> variant, which enables &quot;specializing&quot; shaders and pipelines using custom per-entity keys. This extra flexibility isn't always needed, but when you need it, you will be glad to have it! For example, the built-in StandardMaterial uses specialization to toggle whether or not the Entity should receive lighting in the shader.</p> +<p>We also have big plans to make + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_pbr&#x2F;0.6.0&#x2F;bevy_pbr/trait.Material.html"><code>Material</code></a>s even better:</p> +<ul> +<li><strong>Bind Group derives</strong>: this should cut down on the boilerplate of passing materials to the GPU.</li> +<li><strong>Material Instancing</strong>: materials enable us to implement high-level mesh instancing as a simple configuration item for both built in and custom materials.</li> +</ul> +<h3 id="visibility-and-frustum-culling">Visibility and Frustum Culling +<a class="anchor-link" href="#visibility-and-frustum-culling">#</a> +</h3> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p><a href="https://en.wikipedia.org/wiki/Viewing_frustum#/media/File:ViewFrustum.svg"><img src="https://bevyengine.org/news/bevy-0-6/ViewFrustum.svg" alt="view frustum" /></a></p> +<p>Drawing things is expensive! It requires writing data from the CPU to the GPU, constructing draw calls, and running shaders. We can save a lot of time by <em>not</em> drawing things that the camera can't see. &quot;Frustum culling&quot; is the act of excluding objects that are outside the bounds of the camera's &quot;view frustum&quot;, to avoid wasting work drawing them. For large scenes, this can be the difference between a crisp 60 frames per second and chugging to a grinding halt.</p> +<p><strong>Bevy 0.6</strong> now automatically does frustum culling for 3d objects using their axis-aligned bounding boxes. We might also enable this for 2d objects in future releases, but the wins there will be less pronounced, as drawing sprites is now much cheaper thanks to the new batched rendering.</p> +<h3 id="directional-shadows">Directional Shadows +<a class="anchor-link" href="#directional-shadows">#</a> +</h3> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p>Directional Lights can now cast &quot;directional shadows&quot;, which are &quot;sun-like&quot; shadows cast from a light source infinitely far away. These can be enabled by setting <code>DirectionalLight::shadows_enabled</code> to <code>true</code>.</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/directional_light.png" alt="directional light" /></p> +<p>Note: directional shadows currently require more manual configuration than necessary (check out the <a href="https://github.com/bevyengine/bevy/blob/main/examples/3d/shadow_biases.rs"><code>shadow_projection</code> field in the <code>DirectionalLight</code> setup in the shadow_biases.rs example</a>). We will soon make this automatic and better quality over a larger range through cascaded shadow maps.</p> +<h3 id="point-light-shadows">Point Light Shadows +<a class="anchor-link" href="#point-light-shadows">#</a> +</h3> +<div class="release-feature-authors">authors: @mtsr, Rob Swain (@superdump), @cart</div> +<p>Point lights can now cast &quot;omnidirectional shadows&quot;, which can be enabled by setting <code>PointLight::shadows_enabled</code> to <code>true</code>:</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/point_light.png" alt="point light" /></p> +<h3 id="enabling-and-disabling-entity-shadows">Enabling and Disabling Entity Shadows +<a class="anchor-link" href="#enabling-and-disabling-entity-shadows">#</a> +</h3> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p>Mesh entities can opt out of casting shadows by adding the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_pbr&#x2F;0.6.0&#x2F;bevy_pbr/struct.NotShadowCaster.html"><code>NotShadowCaster</code></a> component.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>NotShadowCaster</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Likewise, they can opt out of receiving shadows by adding the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_pbr&#x2F;0.6.0&#x2F;bevy_pbr/struct.NotShadowReceiver.html"><code>NotShadowReceiver</code></a> component.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>NotShadowReceiver</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="spherical-area-lights">Spherical Area Lights +<a class="anchor-link" href="#spherical-area-lights">#</a> +</h3> +<div class="release-feature-authors">authors: @Josh015</div> +<p><code>PointLight</code> Components can now define a <code>radius</code> value, which controls the size of the sphere that emits light. A normal zero-sized &quot;point light&quot; has a radius of zero.</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/spherical_area_lights.png" alt="spherical area lights" /></p> +<p>(Note that lights with a radius don't normally take up physical space in the world ... I added meshes to help illustrate light position and size)</p> +<h3 id="configurable-alpha-blend-modes">Configurable Alpha Blend Modes +<a class="anchor-link" href="#configurable-alpha-blend-modes">#</a> +</h3> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p>Bevy's StandardMaterial now has an <code>alpha_mode</code> field, which can be set to <code>AlphaMode::Opaque</code>, <code>AlphaMode::Mask(f32)</code>, or <code>AlphaMode::Blend</code>. This field is properly set when loading GLTF scenes.</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/alpha_blend.png" alt="alpha blend modes" /></p> +<h3 id="clustered-forward-rendering">Clustered Forward Rendering +<a class="anchor-link" href="#clustered-forward-rendering">#</a> +</h3> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p>Modern scenes often have many point lights. But when rendering scenes, calculating lighting for each light, for each rendered fragment rapidly becomes prohibitively expensive as the number of lights in the scene increases. <a href="http://www.aortiz.me/2018/12/21/CG.html">Clustered Forward Rendering</a> is a popular approach that increases the number of lights you can have in a scene by dividing up the view frustum into &quot;clusters&quot; (a 3d grid of sub-volumes). Each cluster is assigned lights based on whether they can affect that cluster. This is a form of &quot;culling&quot; that enables fragments to ignore lights that aren't assigned to their cluster.</p> +<p>In practice this can significantly increase the number of lights in the scene:</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/clustered_forward_rendering.png" alt="clustered forward rendering" /></p> +<p>Clusters are 3d subdivisions of the view frustum. They are cuboids in projected space so for a perspective projection, they are stretched and skewed in view space. When debugging them in screen space, you are looking along a row of clusters and so they look like squares. Different colors within a square represent mesh surfaces being at different depths in the scene and so they belong to different clusters:</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/clusters.png" alt="clusters" /></p> +<p>The current implementation is limited to at most 256 lights as we initially prioritized cross-platform compatibility so that everyone could benefit. WebGL2 specifically does not support storage buffers and so the implementation is currently constrained by the maximum uniform buffer size. We can support many more lights on other platforms by using storage buffers, which we will add support for in a future release.</p> +<p><a href="https://youtu.be/dElYzzNovEk">Click here</a> for a video that illustrates Bevy's clustered forward rendering.</p> +<h3 id="sprite-batching">Sprite Batching +<a class="anchor-link" href="#sprite-batching">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>Sprites are now rendered in batches according to their texture within a z-level. They are also opportunistically batched across z-levels. This yields significant performance wins because it drastically reduces the number of draw calls required. Combine that with the other performance improvements in the new Bevy Renderer and things start to get very interesting! On my machine, the old Bevy renderer generally started dropping below 60fps at around 8,000 sprites in our &quot;bevymark&quot; benchmark. With the new renderer on that same machine I can get about 100,000 sprites!</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/bevymark.png" alt="bevymark" /></p> +<p>My machine: Nvidia GTX 1070, Intel i7 7700k, 16GB ram, Arch Linux</p> +<h3 id="sprite-ergonomics">Sprite Ergonomics +<a class="anchor-link" href="#sprite-ergonomics">#</a> +</h3> +<p>Sprite entities are now simpler to spawn:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">spawn_sprite</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, <span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + texture<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>player.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>No need to manage sprite materials! Their texture handle is now a direct component and color can now be set directly on the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_sprite&#x2F;0.6.0&#x2F;bevy_sprite/struct.Sprite.html"><code>Sprite</code></a> component.</p> +<details> + <summary>To compare, expand this to see the old Bevy 0.5 code</summary> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old (Bevy 0.5) +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">spawn_sprite</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, + <span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">materials</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ColorMaterial<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> texture_handle <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>player.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>texture_handle<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +</details> +<h3 id="wgsl-shaders">WGSL Shaders +<a class="anchor-link" href="#wgsl-shaders">#</a> +</h3> +<p>Bevy now uses <a href="https://www.w3.org/TR/WGSL/">WGSL</a> for our built-in shaders and examples. WGSL is a new shader language being developed for WebGPU (although it is a &quot;cross platform&quot; shader language just like GLSL). Bevy still supports GLSL shaders, but WGSL is nice enough that, for now, we are treating it as our &quot;officially recommended&quot; shader language. WGSL is still being developed and polished, but given how much investment it is receiving I believe it is worth betting on. Consider this the start of the &quot;official Bevy shader language&quot; conversation, not the end of it.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">group</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-function z-rust">binding</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-generic z-rust">var<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>uniform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> view<span class="z-punctuation z-separator z-rust">:</span> View<span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">group</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-function z-rust">binding</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-generic z-rust">var<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>uniform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> mesh<span class="z-punctuation z-separator z-rust">:</span> Mesh<span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Vertex</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + [[location(0)]] <span class="z-variable z-other z-member z-rust">position</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">vec3<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>; +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">VertexOutput</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + [[builtin(position)]] <span class="z-variable z-other z-member z-rust">clip_position</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>; +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>vertex</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">vertex</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">vertex</span><span class="z-punctuation z-separator z-rust">:</span> Vertex</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> VertexOutput</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + var out<span class="z-punctuation z-separator z-rust">:</span> VertexOutput<span class="z-punctuation z-terminator z-rust">;</span> + out<span class="z-punctuation z-accessor z-dot z-rust">.</span>clip_position <span class="z-keyword z-operator z-assignment z-rust">=</span> view<span class="z-punctuation z-accessor z-dot z-rust">.</span>view_proj <span class="z-keyword z-operator z-arithmetic z-rust">*</span> mesh<span class="z-punctuation z-accessor z-dot z-rust">.</span>model <span class="z-keyword z-operator z-arithmetic z-rust">*</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>vertex<span class="z-punctuation z-accessor z-dot z-rust">.</span>position<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-keyword z-control z-rust">return</span> out<span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="shader-preprocessor">Shader Preprocessor +<a class="anchor-link" href="#shader-preprocessor">#</a> +</h3> +<div class="release-feature-authors">authors: @cart, Rob Swain (@superdump), @mockersf</div> +<p>Bevy now has its own custom shader preprocessor. It currently supports <code>#import</code>, <code>#ifdef FOO</code>, <code>#ifndef FOO</code>, <code>#else</code>, and <code>#endif</code>, but we will be expanding it with more features to enable simple, flexible shader code reuse and extension.</p> +<p>Shader preprocessors are often used to conditionally enable shader code:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-operator z-rust">#</span>ifdef <span class="z-constant z-other z-rust">TEXTURE</span> +<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">group</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-function z-rust">binding</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +var sprite_texture<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">texture_2d<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-operator z-rust">#</span>endif +</span></code></pre> +<p>This pattern is very useful when defining complicated / configurable shaders (such as Bevy's PBR shader).</p> +<h3 id="shader-imports">Shader Imports +<a class="anchor-link" href="#shader-imports">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>The new preprocessor supports importing other shader files (which pulls in their entire contents). This comes in two forms:</p> +<p>Asset path imports:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-operator z-rust">#</span>import <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>shaders/cool_function.wgsl<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span> + +<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>fragment</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">fragment</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">input</span><span class="z-punctuation z-separator z-rust">:</span> VertexOutput</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> </span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">location</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">return</span> <span class="z-support z-function z-rust">cool_function</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>Plugin-provided imports, which can be registered by Bevy Plugins with arbitrary paths:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-operator z-rust">#</span>import <span class="z-meta z-path z-rust">bevy_pbr<span class="z-punctuation z-accessor z-rust">::</span></span>mesh_view_bind_group + +<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>vertex</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">vertex</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">vertex</span><span class="z-punctuation z-separator z-rust">:</span> Vertex</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> VertexOutput</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> world_position <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-generic z-rust">vec4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>vertex<span class="z-punctuation z-accessor z-dot z-rust">.</span>position<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + var out<span class="z-punctuation z-separator z-rust">:</span> VertexOutput<span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The `view` variable comes from the imported bind group +</span> out<span class="z-punctuation z-accessor z-dot z-rust">.</span>clip_position <span class="z-keyword z-operator z-assignment z-rust">=</span> view<span class="z-punctuation z-accessor z-dot z-rust">.</span>view_proj <span class="z-keyword z-operator z-arithmetic z-rust">*</span> world_position<span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-keyword z-control z-rust">return</span> out<span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>We also plan to experiment with using Naga for &quot;partial imports&quot; of specific, named symbols (ex: import a specific function or struct from a file). It's a 'far out' idea, but this could also enable using Naga's intermediate shader representation as a way of combining pieces of shader code written in different languages into one shader.</p> +<h3 id="pipeline-specialization">Pipeline Specialization +<a class="anchor-link" href="#pipeline-specialization">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>When shaders use a preprocessor and have multiple permutations, the associated &quot;render pipeline&quot; needs to be updated to accommodate those permutations (ex: different Vertex Attributes, Bind Groups, etc). To make this process straightforward, we added the SpecializedPipeline trait, which allows defining specializations for a given key:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">SpecializedPipeline <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">MyPipeline</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-type z-rust">type</span> <span class="z-entity z-name z-type z-rust">Key</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> MyPipelineKey<span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The key here is specified for entities when queuing them up in a RenderPhase +</span> <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">specialize</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-variable z-parameter z-rust">self</span>, <span class="z-variable z-parameter z-rust">key</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust"><span class="z-storage z-type z-rust"><span class="z-storage z-type z-rust">Self</span><span class="z-punctuation z-accessor z-rust">::</span></span></span>Key</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> RenderPipelineDescriptor</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> define a specialized pipeline for the given key here +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Implementors of this trait can then easily and cheaply access specialized pipeline variants (with automatic per-key caching and hot-reloading). If this feels too abstract / advanced, don't worry! This is a &quot;mid-level power-user tool&quot;, not something most Bevy App developers need to contend with.</p> +<h3 id="simpler-shader-stack">Simpler Shader Stack +<a class="anchor-link" href="#simpler-shader-stack">#</a> +</h3> +<p>Bevy now uses <a href="https://github.com/gfx-rs/naga">Naga</a> for all of its shader needs. As a result, we were able to remove all of our complicated non-rust shader dependencies: <code>glsl_to_spirv</code>, <code>shaderc</code>, and <code>spirv_reflect</code>. <code>glsl_to_spirv</code> was a major producer of platform-specific build dependencies and bugs, so this is a huge win!</p> +<h3 id="features-ported-to-the-new-renderer">Features Ported to the New Renderer +<a class="anchor-link" href="#features-ported-to-the-new-renderer">#</a> +</h3> +<p>Render logic for internal Bevy crates had to be rewritten in a number of cases to take advantage of the new renderer. The following people helped with this effort:</p> +<ul> +<li>bevy_sprites: @cart, @StarArawn, @Davier</li> +<li>bevy_pbr: Rob Swain (@superdump), @aevyrie, @cart, @zicklag, @jakobhellermann</li> +<li>bevy_ui: @Davier</li> +<li>bevy_text: @Davier</li> +<li>bevy_gltf: Rob Swain (@superdump)</li> +</ul> +<h3 id="webgl2-support">WebGL2 Support +<a class="anchor-link" href="#webgl2-support">#</a> +</h3> +<div class="release-feature-authors">authors: @zicklag, @mrk-its, @mockersf, Rob Swain (@superdump)</div> +<p>Bevy now has built-in support for deploying to the web using WebGL2 / WASM, thanks to @zicklag adding a native WebGL2 backend to wgpu. There is now no need for the third party <code>bevy_webgl2</code> plugin. Any Bevy app can be deployed to the web by running the following commands:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">cargo build <span class="z-keyword z-operator z-arithmetic z-rust">-</span><span class="z-keyword z-operator z-arithmetic z-rust">-</span>target wasm32<span class="z-keyword z-operator z-arithmetic z-rust">-</span>unknown<span class="z-keyword z-operator z-arithmetic z-rust">-</span>unknown +wasm<span class="z-keyword z-operator z-arithmetic z-rust">-</span>bindgen <span class="z-keyword z-operator z-arithmetic z-rust">-</span><span class="z-keyword z-operator z-arithmetic z-rust">-</span>out<span class="z-keyword z-operator z-arithmetic z-rust">-</span>dir <span class="z-constant z-other z-rust">OUTPUT_DIR</span> <span class="z-keyword z-operator z-arithmetic z-rust">-</span><span class="z-keyword z-operator z-arithmetic z-rust">-</span>target web <span class="z-constant z-other z-rust">TARGET_DIR</span> +</span></code></pre> +<p>The New Bevy Renderer developers prioritized cross-platform compatibility for the initial renderer feature implementation and so had to carefully operate within the limits of WebGL2 (ex: storage buffers and compute shaders aren't supported in WebGL2), but the results were worth it! Over time, features will be implemented that leverage more modern/advanced features such as compute shaders. But it is important to us that everyone has access to a solid visual experience for their games and applications regardless of their target platform(s).</p> +<p>You can try out Bevy's WASM support in your browser using our new <a href="/examples">Bevy Examples</a> page:</p> +<p><a href="/examples"><img src="https://bevyengine.org/news/bevy-0-6/bevy_examples_wasm.png" alt="wasm bevy examples" /></a></p> +<h3 id="infinite-reverse-z-perspective-projection">Infinite Reverse Z Perspective Projection +<a class="anchor-link" href="#infinite-reverse-z-perspective-projection">#</a> +</h3> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p>For improved precision in the &quot;useful range&quot;, the industry has largely adopted &quot;reverse projections&quot; with an &quot;infinite&quot; far plane. The new Bevy renderer was adapted to use the &quot;right-handed infinite reverse z&quot; projection. <a href="https://developer.nvidia.com/content/depth-precision-visualized">This Nvidia article</a> does a great job of explaining why this is so worthwhile.</p> +<h3 id="compute-shaders">Compute Shaders +<a class="anchor-link" href="#compute-shaders">#</a> +</h3> +<p>The new renderer makes it possible for users to write compute shaders. Our new <a href="https://github.com/bevyengine/bevy/blob/v0.6.0/examples/shader/compute_shader_game_of_life.rs">&quot;compute shader game of life&quot; example</a> (by @jakobhellermann) illustrates how to write compute shaders in Bevy.</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/compute.png" alt="compute game of life" /></p> +<h3 id="new-multiple-windows-example">New Multiple Windows Example +<a class="anchor-link" href="#new-multiple-windows-example">#</a> +</h3> +<div class="release-feature-authors">authors: @DJMcNab</div> +<p>The &quot;multiple windows&quot; example has been updated to use the new renderer APIs. Thanks to the new renderer APIs, this example is now <a href="https://github.com/bevyengine/bevy/blob/v0.6.0/examples/window/multiple_windows.rs">much nicer to look at</a> (and will look even nicer when we add high-level Render Targets).</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/multiple_windows.png" alt="multiple windows" /></p> +<h3 id="crevice">Crevice +<a class="anchor-link" href="#crevice">#</a> +</h3> +<div class="release-feature-authors">authors: @cart, @mockersf, Rob Swain (@superdump)</div> +<p>Bevy's old <code>Bytes</code> abstraction has been replaced with a fork of the <a href="https://github.com/LPGhatguy/crevice">crevice</a> crate (by @LPGhatguy), which makes it possible to write normal Rust types to GPU-friendly data layouts. Namely std140 (uniform buffers default to this layout) and std430 (storage buffers default to this layout). Bevy exports <code>AsStd140</code> and <code>AsStd430</code> derives:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">AsStd140</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MeshUniform</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-modifier z-rust">pub</span> <span class="z-variable z-other z-member z-rust">transform</span><span class="z-punctuation z-separator z-type z-rust">:</span> Mat4, + <span class="z-storage z-modifier z-rust">pub</span> <span class="z-variable z-other z-member z-rust">inverse_transpose_model</span><span class="z-punctuation z-separator z-type z-rust">:</span> Mat4, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Coupling an <code>AsStd140</code> derive with our new <code>UniformVec&lt;T&gt;</code> type makes it easy to write Rust types to shader-ready uniform buffers:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> WGSL shader +</span><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Mesh</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">model</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">mat4x4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>; + inverse_transpose_model<span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">mat4x4<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>; +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-support z-function z-rust">group</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">2</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-function z-rust">binding</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-generic z-rust">var<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>uniform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> mesh<span class="z-punctuation z-separator z-rust">:</span> Mesh<span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>We (in the short term) forked crevice for a couple of reasons:</p> +<ul> +<li>To merge <a href="https://github.com/LPGhatguy/crevice/pull/27/">Array Support PR</a> by @ElectronicRU, as we need support for arrays in our uniforms.</li> +<li>To re-export crevice derives and provide an &quot;out of the box&quot; experience for Bevy</li> +</ul> +<p>Ultimately, we'd like to move back upstream if possible. A big thanks to the crevice developers for building such useful software!</p> +<h3 id="uv-sphere-mesh-shape">UV Sphere Mesh Shape +<a class="anchor-link" href="#uv-sphere-mesh-shape">#</a> +</h3> +<div class="release-feature-authors">authors: @nside</div> +<p>Bevy now has a built-in &quot;uv sphere&quot; mesh primitive.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-path z-rust">Mesh<span class="z-punctuation z-accessor z-rust">::</span></span>from<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>UVSphere <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + radius<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + sectors<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">16</span><span class="z-punctuation z-separator z-rust">,</span> + stacks<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">32</span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p><img src="https://bevyengine.org/news/bevy-0-6/uv_sphere.png" alt="uv sphere" /></p> +<h3 id="flat-normal-computation">Flat Normal Computation +<a class="anchor-link" href="#flat-normal-computation">#</a> +</h3> +<div class="release-feature-authors">authors: @jakobhellermann</div> +<p>The <code>Mesh</code> type now has a <code>compute_flat_normals()</code> function. Imported GLTF meshes without normals now automatically have flat normals computed, <a href="https://www.khronos.org/registry/glTF/specs/2.0/glTF-2.0.html#meshes">in accordance with the GLTF spec</a>.</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/flat_normals.png" alt="flat normals" /></p> +<h3 id="faster-gltf-loading">Faster GLTF Loading +<a class="anchor-link" href="#faster-gltf-loading">#</a> +</h3> +<div class="release-feature-authors">authors: @DJMcNab, @mockersf</div> +<p>@DJMcNab fixed nasty non-linear loading of GLTF nodes, which made them load much faster. One complicated scene went from 40 seconds to 0.2 seconds. Awesome!</p> +<p>@mockersf made GLTF textures load asynchronously in Bevy's &quot;IO task pool&quot;, which almost halved GLTF scene load times in some cases.</p> +<p>We are also in the process of adding &quot;compressed texture loading&quot;, which will substantially speed up GLTF scene loading, especially for large scenes!</p> +<h2 id="bevy-ecs">Bevy ECS +<a class="anchor-link" href="#bevy-ecs">#</a> +</h2> +<h3 id="no-more-system">No more <code>.system()</code>! +<a class="anchor-link" href="#no-more-system">#</a> +</h3> +<div class="release-feature-authors">authors: @DJMcNab, @Ratysz</div> +<p>One of our highest priorities for Bevy ECS is &quot;ergonomics&quot;. In the past I have made wild claims that Bevy ECS is the <a href="https://bevyengine.org/news/introducing-bevy/#ergonomics">most ergonomic ECS in existence</a>. We've spent gratuitous amounts of R&amp;D pioneering new API techniques and I believe the results speak for themselves:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This is a standalone Bevy 0.5 App that adds a simple `gravity` system to the App&#39;s schedule +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> and automatically runs it in parallel with other systems +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>DefaultPlugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>gravity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">gravity</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> transform <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + transform<span class="z-punctuation z-accessor z-dot z-rust">.</span>translation<span class="z-punctuation z-accessor z-dot z-rust">.</span>y <span class="z-keyword z-operator z-assignment z-rust">+=</span> <span class="z-keyword z-operator z-arithmetic z-rust">-</span><span class="z-constant z-numeric z-float z-rust">9.</span><span class="z-constant z-numeric z-float z-rust">8</span> <span class="z-keyword z-operator z-arithmetic z-rust">*</span> time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">delta_seconds</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>I believe we were already the best in the market by a wide margin (especially if you take into account our automatic parallelization and change detection), but we had one thing holding us back from perfection ... that pesky <code>.system()</code>! We've tried removing it a number of times, but due to rustc limitations and safety issues, it always eluded us. Finally, @DJMcNab <a href="https://github.com/bevyengine/bevy/pull/2398">found a solution</a>. As a result, in Bevy 0.6 you can now register the system above like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> pure bliss! +</span><span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>DefaultPlugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>gravity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="the-new-component-trait-and-derive-component">The New Component Trait and #[derive(Component)] +<a class="anchor-link" href="#the-new-component-trait-and-derive-component">#</a> +</h3> +<div class="release-feature-authors">authors: @Frizi</div> +<p>In <strong>Bevy 0.6</strong> types no longer implement the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.6.0&#x2F;bevy_ecs/trait.Component.html"><code>Component</code></a> trait by default. Before you get angry ... stick with me for a second. I promise this is for the best! In past Bevy versions, we got away with &quot;auto implementing&quot; + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.6.0&#x2F;bevy_ecs/trait.Component.html"><code>Component</code></a> for types using this &quot;blanket impl&quot;:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span></span><span class="z-meta z-impl z-rust"><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>T<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">Send</span> <span class="z-keyword z-operator z-rust">+</span> <span class="z-support z-type z-rust">Sync</span> <span class="z-keyword z-operator z-rust">+</span> <span class="z-storage z-modifier z-lifetime z-rust">&#39;static</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-impl z-rust"> Component <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">T</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>This removed the need for users to manually implement + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.6.0&#x2F;bevy_ecs/trait.Component.html"><code>Component</code></a> for their types. Early on this seemed like an ergonomics win with no downsides. But Bevy ECS, our understanding of the problem space, and our plans for the future have changed a lot since then:</p> +<ul> +<li><strong>It turns out <em>not everything</em> should be a Component</strong>: Our users <em>constantly</em> accidentally add non-component types as components. New users accidentally adding Bundles and type constructors as Components are our most common <code>#help</code> channel threads on <a href="https://discord.gg/bevy">our Discord</a>. This class of error is very hard to debug because things just silently &quot;don't work&quot;. When not everything is a Component, rustc can properly yell at you with informative errors when you mess up.</li> +<li><strong>Optimizations</strong>: If we implement Component for everything automatically, we can't customize the Component type with associated types. This prevents an entire class of optimization. For example, Bevy ECS now has <a href="/news/bevy-0-5/#hybrid-component-storage-the-solution">multiple Component storage types</a>. By moving the storage type into Component, we enable rustc to optimize checks that would normally need to happen at runtime. @Frizi was able to <a href="https://github.com/bevyengine/bevy/pull/2254#issuecomment-857863116">significantly improve our Query iterator performance</a> by moving the storage type into Component. I expect us to find more optimizations in this category.</li> +<li><strong>Automatic registration</strong>: Moving more logic into Component also gives us the ability to do fancier things in the future like &quot;automatically registering Reflect impls when deriving Component&quot;. Non-blanket Component impls do add a small amount of boilerplate, but they also have the potential to massively reduce the &quot;total boilerplate&quot; of an app.</li> +<li><strong>Documentation</strong>: Deriving Component serves as a form of self-documentation. It's now easy to tell what types are components at a glance.</li> +<li><strong>Organized</strong>: In Bevy 0.5 Component-specific configuration like &quot;storage type&quot; had to be registered in a centralized Plugin somewhere. Moving Component configuration into the Component trait allows users to keep &quot;Component type information&quot; right next to the type itself.</li> +<li><strong>Event Handlers</strong>: Non-blanket Component impls will eventually allow us to add event handlers like <code>on_insert(world: &amp;mut World)</code> to the Component trait. Very useful!</li> +</ul> +<p>Hopefully by now you're convinced that this is the right move. If not ... I'm sorry ... you still need to implement Component manually in Bevy 0.6. You can either derive Component:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> defaults to &quot;Table&quot; storage +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">SomeComponent</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> overrides the default storage +</span><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Component</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">component</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">storage <span class="z-keyword z-operator z-rust">=</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>SparseSet<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">SomeComponent</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Or you can manually implement it:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">SomeComponent</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">Component <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">SomeComponent</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-type z-rust">type</span> <span class="z-entity z-name z-type z-rust">Storage</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> TableStorage<span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">Component <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">SomeComponent</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-type z-rust">type</span> <span class="z-entity z-name z-type z-rust">Storage</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> SparseSetStorage<span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="iter-for-mutable-queries">iter() for mutable Queries +<a class="anchor-link" href="#iter-for-mutable-queries">#</a> +</h3> +<div class="release-feature-authors">authors: @Guvante</div> +<p>Mutable queries can now be immutably iterated, returning immutable references to components:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> player <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> player is an immutable reference +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> player <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> player is a mutable reference +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Compare that to the complicated QuerySet that this would have needed in previous Bevy versions to avoid conflicting immutable and mutable Queries:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Gross! +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">players</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">QuerySet<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">QueryState<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-meta z-generic z-rust">QueryState<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> player <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">q0</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> player is an immutable reference +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-keyword z-control z-rust">for</span> <span class="z-storage z-modifier z-rust">mut</span> player <span class="z-keyword z-operator z-rust">in</span> players<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">q1</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> player is a mutable reference +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="systemstate">SystemState +<a class="anchor-link" href="#systemstate">#</a> +</h3> +<p>Have you ever wanted to use &quot;system params&quot; directly with a Bevy World? With + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.6.0&#x2F;bevy_ecs/struct.SystemState.html"><code>SystemState</code></a>, now you can!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> system_state<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">SystemState<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>A<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>B<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">SystemState<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> query</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> system_state<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>For those working directly with <code>World</code>, this is a game changer. It makes it possible to mutably access multiple disjoint Components and Resources (often eliminating the need for more costly abstractions like <code>WorldCell</code>).</p> +<p> + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.6.0&#x2F;bevy_ecs/struct.SystemState.html"><code>SystemState</code></a> does all of the same caching that a normal Bevy system does, so reusing the same SystemState results in uber-fast World access.</p> +<h3 id="sub-apps">Sub Apps +<a class="anchor-link" href="#sub-apps">#</a> +</h3> +<div class="release-feature-authors">authors: @cart, @zicklag, @bjorn3</div> +<p>The new Bevy renderer requires strict separation between the &quot;main app&quot; and the &quot;render app&quot;. To enable this, we added the concept of &quot;sub-apps&quot;:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Debug<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> Copy<span class="z-punctuation z-separator z-rust">,</span> Hash<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Eq<span class="z-punctuation z-separator z-rust">,</span> AppLabel</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">RenderApp</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> render_app <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>empty<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_sub_app</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>RenderApp<span class="z-punctuation z-separator z-rust">,</span> render_app<span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-modifier z-rust">move</span> <span class="z-keyword z-operator z-bitwise z-rust">|</span>app_world<span class="z-punctuation z-separator z-rust">,</span> render_app<span class="z-keyword z-operator z-bitwise z-rust">|</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> execute app logic here +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> later +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">sub_app_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>RenderApp</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_other_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>We plan on exposing more control over scheduling, running, and working with sub-apps in the future.</p> +<h3 id="query-iter-combinations">Query::iter_combinations +<a class="anchor-link" href="#query-iter-combinations">#</a> +</h3> +<div class="release-feature-authors">authors: @Frizi</div> +<p>You can now iterate all combinations of N entities for a given query:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> iterates each possible combination of two entities exactly once +</span> <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>p1<span class="z-punctuation z-separator z-rust">,</span> p2<span class="z-punctuation z-section z-group z-end z-rust">]</span></span> <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_combinations</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> iterates each possible combination of three entities exactly once +</span> <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>p1<span class="z-punctuation z-separator z-rust">,</span> p2<span class="z-punctuation z-separator z-rust">,</span> p3<span class="z-punctuation z-section z-group z-end z-rust">]</span></span> <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_combinations</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>This is especially useful for things like &quot;checking for entities for collisions with all other entities&quot;. There is also an <code>iter_combinations_mut</code> variant. Just be careful ... the time complexity of this grows exponentially as the number of entities in your combinations increases. With great power comes great responsibility!</p> +<p>The new <a href="https://github.com/bevyengine/bevy/blob/v0.6.0/examples/ecs/iter_combinations.rs">iter_combinations example</a> illustrates how to use this new API to calculate gravity between objects in a &quot;solar system&quot;:</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/iter_combinations.png" alt="iter_combinations" /></p> +<h3 id="optimized-system-commands">Optimized System Commands +<a class="anchor-link" href="#optimized-system-commands">#</a> +</h3> +<div class="release-feature-authors">authors: @NathanSWard</div> +<p>System Commands got a nice performance boost by changing how command buffers are stored and reused:</p> +<h4 id="entity-spawn-benchmark-duration-in-microseconds-less-is-better">Entity Spawn Benchmark Duration (in microseconds, less is better) +<a class="anchor-link" href="#entity-spawn-benchmark-duration-in-microseconds-less-is-better">#</a> +</h4> +<p>This benchmark spawns entities with a variety of component compositions to ensure we cover a variety of cases. Treat these numbers as relatives, not absolutes.</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/commands_perf.svg" alt="commands perf" /></p> +<h3 id="system-param-lifetimes">System Param Lifetimes +<a class="anchor-link" href="#system-param-lifetimes">#</a> +</h3> +<div class="release-feature-authors">authors: @cart, @BoxyUwU, @TheRawMeatball</div> +<p>System and Query lifetimes were made more explicit by splitting out the <code>'system</code> and <code>'world</code>, lifetimes and using them explicitly where possible. This enables Rust to reason about ECS lifetimes more effectively, especially for read-only lifetimes. This was particularly important because it enabled the new Bevy Renderer to convince wgpu that ECS resources actually live for as long as the Render World.</p> +<p>Note that this does make the lifetimes on SystemParam derives slightly more complicated as a result:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">SystemParam</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-generic z-rust"><span class="z-entity z-name z-struct z-rust">CustomParam</span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;w</span>, <span class="z-storage z-modifier z-lifetime z-rust">&#39;s</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span></span><span class="z-meta z-struct z-rust"> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">res</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;w</span>, AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">query</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;w</span>, <span class="z-storage z-modifier z-lifetime z-rust">&#39;s</span>, <span class="z-meta z-generic z-rust">Read<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">local</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">Local<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-modifier z-lifetime z-rust">&#39;s</span>, <span class="z-storage z-type z-rust">i32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="soundness-correctness-improvements">Soundness / Correctness Improvements +<a class="anchor-link" href="#soundness-correctness-improvements">#</a> +</h3> +<div class="release-feature-authors">authors: @BoxyUwU, @TheRawMeatball, @Frizi, @thebluefish, @sapir, @bjorn3, @DJMcNab</div> +<p>Bevy ECS received a solid number of soundness and correctness bug fixes this release, alongside some unsafe code block removals. Queries and internal storages like Tables and BlobVecs in particular had a number of fixes and improvements in these areas. As Bevy ECS matures, our bar for unsafe code blocks and soundness must also mature. Bevy ECS will probably never be 100% free of unsafe code blocks, because we are modeling parallel data access that Rust literally cannot reason about without our help. But we are committed to removing as much unsafe code as we can (and we have a number of refactors in the works to further improve the situation).</p> +<h3 id="hierarchy-convenience-functions">Hierarchy Convenience Functions +<a class="anchor-link" href="#hierarchy-convenience-functions">#</a> +</h3> +<div class="release-feature-authors">authors: @TheRawMeatball, @jihiggins</div> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Despawns all descendants of an entity (its children, its childrens&#39; children, etc) +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>e</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">despawn_descendants</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Removes the given children from the entity +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>parent</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">remove_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>child1<span class="z-punctuation z-separator z-rust">,</span> child2<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="ui">UI +<a class="anchor-link" href="#ui">#</a> +</h2> +<h3 id="overflow-hidden">Overflow::Hidden +<a class="anchor-link" href="#overflow-hidden">#</a> +</h3> +<div class="release-feature-authors">authors: @Davier</div> +<p>UI now respects the flexbox <code>Overflow::Hidden</code> property. This can be used to cut off child content, which is useful when building things like scrollable lists:</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/overflow.png" alt="overflow hidden" /></p> +<h3 id="text2d-transforms">Text2D Transforms +<a class="anchor-link" href="#text2d-transforms">#</a> +</h3> +<div class="release-feature-authors">authors: @nside, @CleanCut</div> +<p><code>Text2d</code> now supports arbitrary transformations using the Transform component:</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/text2d_transforms.png" alt="text 2d transforms" /></p> +<p>Note that while <code>Transform::scale</code> does have its uses, it is generally still a good idea to adjust text size using the &quot;font size&quot; to ensure it renders &quot;crisply&quot;.</p> +<h3 id="window-transparency">Window Transparency +<a class="anchor-link" href="#window-transparency">#</a> +</h3> +<div class="release-feature-authors">authors: @louisgjohnson</div> +<p>Winit's &quot;window transparency&quot; feature is now exposed in Bevy's Window type. This allows users to build &quot;widget like&quot; apps without backgrounds or window decorations (on platforms that support it). Here is a Bevy app with a transparent background, rendering a Bevy Logo sprite on top of my Linux desktop background. Seamless! Cool!</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/transparent_window.png" alt="transparent window" /></p> +<h2 id="transforms">Transforms +<a class="anchor-link" href="#transforms">#</a> +</h2> +<h3 id="friendly-directional-vectors">Friendly Directional Vectors +<a class="anchor-link" href="#friendly-directional-vectors">#</a> +</h3> +<div class="release-feature-authors">authors: @guimcaballero</div> +<p>Bevy Transforms now have friendly &quot;directional&quot; functions that return relative vectors:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Points to the left of the transform +</span><span class="z-storage z-type z-rust">let</span> left<span class="z-punctuation z-separator z-rust">:</span> Vec4 <span class="z-keyword z-operator z-assignment z-rust">=</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">left</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Points to the right of the transform +</span><span class="z-storage z-type z-rust">let</span> right<span class="z-punctuation z-separator z-rust">:</span> Vec4 <span class="z-keyword z-operator z-assignment z-rust">=</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">right</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Points up from the transform +</span><span class="z-storage z-type z-rust">let</span> up<span class="z-punctuation z-separator z-rust">:</span> Vec4 <span class="z-keyword z-operator z-assignment z-rust">=</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">up</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Points down from the transform +</span><span class="z-storage z-type z-rust">let</span> down<span class="z-punctuation z-separator z-rust">:</span> Vec4 <span class="z-keyword z-operator z-assignment z-rust">=</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">down</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Points forward from the transform +</span><span class="z-storage z-type z-rust">let</span> forward<span class="z-punctuation z-separator z-rust">:</span> Vec4 <span class="z-keyword z-operator z-assignment z-rust">=</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">forward</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Points back from the transform +</span><span class="z-storage z-type z-rust">let</span> back<span class="z-punctuation z-separator z-rust">:</span> Vec4 <span class="z-keyword z-operator z-assignment z-rust">=</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">back</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="transform-builder-methods">Transform Builder Methods +<a class="anchor-link" href="#transform-builder-methods">#</a> +</h3> +<div class="release-feature-authors">authors: @Lythenas</div> +<p>Transforms now have helpful <code>with_translation()</code>, <code>with_rotation()</code>, and <code>with_scale()</code> builder methods:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-path z-rust">Transform<span class="z-punctuation z-accessor z-rust">::</span></span>from_xyz<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_scale</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Vec3<span class="z-punctuation z-accessor z-rust">::</span></span>splat<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h2 id="rust-2021">Rust 2021 +<a class="anchor-link" href="#rust-2021">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf, @YohDeadfall</div> +<p>Bevy has been updated to use Rust 2021. This means we can take advantage of the new Cargo feature resolver by default (which both Bevy and the new wgpu version require). Make sure you update your crates to Rust 2021 or you will need to manually enable the new feature resolver with <code>resolver = &quot;2&quot;</code> in your Cargo.toml.</p> +<pre data-lang="toml" class="language-toml z-code"><code class="language-toml" data-lang="toml"><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">package</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span> +<span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">name</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">&quot;</span>your_app<span class="z-punctuation z-definition z-string z-end z-toml">&quot;</span></span> +<span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">version</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">&quot;</span>0.1.0<span class="z-punctuation z-definition z-string z-end z-toml">&quot;</span></span> +<span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">edition</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">&quot;</span>2021<span class="z-punctuation z-definition z-string z-end z-toml">&quot;</span></span> +</span></code></pre> +<p>Note that &quot;virtual Cargo workspaces&quot; still need to manually define <code>resolver = &quot;2&quot;</code>, even in Rust 2021. <a href="https://doc.rust-lang.org/edition-guide/rust-2021/default-cargo-resolver.html#details">Refer to the Rust 2021 documentation</a> for details.</p> +<pre data-lang="toml" class="language-toml z-code"><code class="language-toml" data-lang="toml"><span class="z-source z-toml"><span class="z-punctuation z-definition z-table z-begin z-toml">[</span><span class="z-meta z-tag z-table z-toml"><span class="z-entity z-name z-table z-toml">workspace</span></span><span class="z-punctuation z-definition z-table z-end z-toml">]</span> +<span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">resolver</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">&quot;</span>2<span class="z-punctuation z-definition z-string z-end z-toml">&quot;</span></span> <span class="z-comment z-line z-number-sign z-toml"><span class="z-punctuation z-definition z-comment z-toml">#</span> Important! wgpu/Bevy needs this!</span> +<span class="z-meta z-tag z-key z-toml"><span class="z-entity z-name z-tag z-toml">members</span></span> <span class="z-punctuation z-definition z-key-value z-toml">=</span> <span class="z-punctuation z-definition z-array z-begin z-toml">[</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">&quot;</span>my_crate1<span class="z-punctuation z-definition z-string z-end z-toml">&quot;</span></span><span class="z-punctuation z-separator z-array z-toml">,</span> <span class="z-string z-quoted z-double z-basic z-toml"><span class="z-punctuation z-definition z-string z-begin z-toml">&quot;</span>my_crate2<span class="z-punctuation z-definition z-string z-end z-toml">&quot;</span></span> <span class="z-punctuation z-definition z-array z-end z-toml">]</span> +</span></code></pre> +<h2 id="input">Input +<a class="anchor-link" href="#input">#</a> +</h2> +<h3 id="gamepads-resource">Gamepads Resource +<a class="anchor-link" href="#gamepads-resource">#</a> +</h3> +<div class="release-feature-authors">authors: @CrazyRoka</div> +<p><strong>Bevy 0.6</strong> adds a <code>Gamepads</code> resource, which automatically maintains a collection of connected gamepads.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">gamepads</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Gamepads<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> iterates every active game pad +</span> <span class="z-keyword z-control z-rust">for</span> gamepad <span class="z-keyword z-operator z-rust">in</span> gamepads<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="input-any-variants">Input &quot;any&quot; variants +<a class="anchor-link" href="#input-any-variants">#</a> +</h3> +<div class="release-feature-authors">authors: @DJMcNab</div> +<p><code>Input</code> collections now have an <code>any_pressed()</code> function, which returns true when any of the given inputs are pressed.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"> <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">input</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Input<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>KeyCode<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> input<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">any_pressed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-path z-rust">KeyCode<span class="z-punctuation z-accessor z-rust">::</span></span>LShift<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">KeyCode<span class="z-punctuation z-accessor z-rust">::</span></span>RShift<span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>one or both of the two shift keys are pressed<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="profiling">Profiling +<a class="anchor-link" href="#profiling">#</a> +</h2> +<h3 id="more-spans">More Spans +<a class="anchor-link" href="#more-spans">#</a> +</h3> +<div class="release-feature-authors">authors: @cart, @mockersf, @hymm</div> +<p>The new renderer now has tracing spans for frames, the render app schedule, and the Render Graph (with named Sub Graphs spans). The system executor now has finer grained spans, filling in most of the remaining blanks. Applying System Commands also now has spans.</p> +<p>(ignore those weird characters in the spans ... we're <a href="https://github.com/bevyengine/bevy/issues/3563">investigating</a> that)</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/render_app_profiling.png" alt="render app profiling" /></p> +<h3 id="tracy-backend">Tracy Backend +<a class="anchor-link" href="#tracy-backend">#</a> +</h3> +<div class="release-feature-authors">authors: Rob Swain (@superdump)</div> +<p>Bevy now supports the <a href="https://github.com/wolfpld/tracy">tracy</a> profiler via the <code>trace_tracy</code> Cargo feature.</p> +<p><img src="https://bevyengine.org/news/bevy-0-6/tracy.png" alt="tracy" /></p> +<h3 id="fromreflect-trait-and-derive">FromReflect Trait and Derive +<a class="anchor-link" href="#fromreflect-trait-and-derive">#</a> +</h3> +<div class="release-feature-authors">authors: @Davier</div> +<p>Types can now derive the new <code>FromReflect</code> trait, which enables creating &quot;clones&quot; of a type using arbitrary <code>Reflect</code> impls. This is currently used to make reflected collection types (like <code>Vec</code>) work properly, but it will also be useful for &quot;round trip&quot; conversions to and from <code>Reflect</code> types.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect<span class="z-punctuation z-separator z-rust">,</span> FromReflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Foo</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">bar</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">usize</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-storage z-type z-rust">let</span> foo <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">Foo<span class="z-punctuation z-accessor z-rust">::</span></span>from_reflect<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>dyn some_reflected_value</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="bevy-error-codes">Bevy Error Codes +<a class="anchor-link" href="#bevy-error-codes">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf, @NiklasEi</div> +<p>To make it easier to search for and discuss common Bevy errors, we decided to add a formal <a href="https://github.com/bevyengine/bevy/tree/main/errors">error codes system</a>, much like the one <a href="https://github.com/rust-lang/rust/tree/master/compiler/rustc_error_codes/src/error_codes">that rustc uses</a>;</p> +<p>Error codes and their descriptions also have an automatically-generated <a href="/learn/errors/">page on the Bevy website</a>.</p> +<h2 id="bevy-assets">Bevy Assets +<a class="anchor-link" href="#bevy-assets">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>The curated awesome-bevy GitHub repo containing a list of Bevy plugins, crates, apps, and learning resources is now reborn as <a href="https://github.com/bevyengine/bevy-assets">Bevy Assets</a>!</p> +<p>Bevy Assets introduces:</p> +<ul> +<li>A structured toml format</li> +<li>Asset icons</li> +<li><a href="/assets">bevy-website integration</a></li> +</ul> +<p>This is just the beginning! We have plans to integrate with <a href="http://crates.io">crates.io</a> and GitHub, improve indexing / tagging / searchability, add asset-specific pages, prettier styles, content delivery, and more. Ultimately we want this to grow into something that can enable first-class, modern asset-driven workflows.</p> +<p>We have automatically migrated existing awesome-bevy entries, but we encourage creators to customize them! If you are working on something Bevy related, you are highly encouraged to <a href="https://github.com/bevyengine/bevy-assets">add a Bevy Assets entry</a>.</p> +<h2 id="dual-mit-apache-2-0-license">Dual MIT / Apache-2.0 License +<a class="anchor-link" href="#dual-mit-apache-2-0-license">#</a> +</h2> +<div class="release-feature-authors">authors: @cart, @DJMcNab</div> +<p>Thanks to the relevant contributors (<a href="https://github.com/bevyengine/bevy/issues/2373">all 246 of them</a>), Bevy is now dual licensed under MIT <em>and</em> Apache-2.0, at the developers' option. This means developers have the flexibility to choose the license that best suits their specific needs. I want to stress that this is now <em>less</em> restrictive than MIT-only, not more.</p> +<p>I originally chose to license Bevy exclusively under MIT for a variety of reasons:</p> +<ul> +<li>People and companies generally know and trust the MIT license more than any other license. Apache 2.0 is less known and trusted.</li> +<li>It is short and easy to understand</li> +<li>Many people aren't familiar with the &quot;multiple license options ... choose your favorite&quot; approach. I didn't want to scare people away unnecessarily.</li> +<li>Other open source engines like Godot have had a lot of success with MIT-only licensing</li> +</ul> +<p>However, there were a variety of issues that have come up that make dual-licensing Bevy under both MIT and Apache-2.0 compelling:</p> +<ul> +<li>The MIT license (arguably) requires binaries to reproduce countless copies of the same license boilerplate for every MIT library in use. Apache-2.0 allows us to compress the boilerplate into a single instance of the license.</li> +<li>The Apache-2.0 license has protections from patent trolls and an explicit contribution licensing clause.</li> +<li>The Rust ecosystem is largely Apache-2.0. Being available under that license is good for interoperation and opens the doors to upstreaming Bevy code into other projects (Rust, the async ecosystem, etc).</li> +<li>The Apache license is incompatible with GPLv2, but MIT is compatible.</li> +</ul> +<h2 id="bevy-org-changes">Bevy Org Changes +<a class="anchor-link" href="#bevy-org-changes">#</a> +</h2> +<h3 id="more-pull-request-mergers">More pull request mergers! +<a class="anchor-link" href="#more-pull-request-mergers">#</a> +</h3> +<p>I've been at my scalability limits for a while. It has been <em>cough</em>... challenging... to build the engine features I need to, review every single pull request quickly, and preserve my mental health. I've made it this far ... sometimes by overworking myself and sometimes by letting PRs sit unmerged for longer than I'd like. By scaling out, we can have our cake and eat it too!</p> +<ul> +<li>@mockersf now has merge rights for &quot;uncontroversial changes&quot;</li> +<li>@alice-i-cecile now has merge rights for &quot;uncontroversial documentation changes&quot;</li> +</ul> +<h3 id="new-issue-labels">New issue labels +<a class="anchor-link" href="#new-issue-labels">#</a> +</h3> +<p>After <a href="https://github.com/bevyengine/bevy/issues/2256">much discussion about naming conventions and colors</a>, we finally have a <a href="https://github.com/bevyengine/bevy/labels">fresh new set of issue labels</a> (loosely inspired by the rust repo). The <a href="https://github.com/bevyengine/bevy/blob/main/CONTRIBUTING.md#how-were-organized">Bevy Triage Team</a> can finally express themselves fully!</p> +<h3 id="comprehensive-contributing-md">Comprehensive CONTRIBUTING.md +<a class="anchor-link" href="#comprehensive-contributing-md">#</a> +</h3> +<div class="release-feature-authors">authors: @alice-i-cecile</div> +<p>We now have a relatively complete <a href="https://github.com/bevyengine/bevy/blob/main/CONTRIBUTING.md">Contributors Guide</a>. If you are interested in contributing code or documentation to Bevy, that is a great place to start!</p> +<h3 id="ci-build-system-improvements">CI Build System Improvements +<a class="anchor-link" href="#ci-build-system-improvements">#</a> +</h3> +<div class="release-feature-authors">authors: @mockersf, @NathanSWard, @NiklasEi</div> +<p>We made a ton of CI improvements this release:</p> +<ul> +<li>We now fail on cargo doc warnings</li> +<li>We now use <a href="https://github.com/EmbarkStudios/cargo-deny">cargo deny</a> to protect against vulnerabilities, duplicate dependencies, and invalid licenses</li> +<li>PRs are now automatically labeled with the <code>S-Needs-Triage</code> label</li> +<li>Ci stability and speed improvements</li> +<li>We now check that our benchmarks build</li> +<li>We now assert compiler errors for compile_fail tests, giving us much stricter guarantees</li> +<li>Examples are now run using lavapipe (instead of swiftshader) for faster CI validation</li> +</ul> +<h2 id="what-s-next-for-bevy">What's Next For Bevy? +<a class="anchor-link" href="#what-s-next-for-bevy">#</a> +</h2> +<p>Bevy development continues to pick up steam, and we have no intention to slow down now! In addition to the <a href="https://github.com/bevyengine/rfcs/pulls">many RFCs</a> we have in the works, we also plan on tackling the following over the next few months:</p> +<h3 id="the-train-release-schedule">The &quot;Train&quot; Release Schedule +<a class="anchor-link" href="#the-train-release-schedule">#</a> +</h3> +<p>In the last two Bevy releases we made massive, sweeping changes to core systems. <strong>Bevy 0.5</strong> was &quot;the one where we rewrote Bevy ECS&quot;. <strong>Bevy 0.6</strong> was &quot;the one where we rewrote Bevy Render&quot;. These massive reworks took time, and as a result held back a bunch of other useful features and bug fixes. They also created pressure to &quot;crunch&quot; and finish big features quickly to unblock releases. Crunching is unhealthy and should be avoided at all costs!</p> +<p><a href="https://bevyengine.org/community/">The Bevy Community</a> has reached relative consensus that we should have a more regular, more predictable release schedule. One where large features can't gum up the system.</p> +<p>From now on, we will cut releases <em>approximately</em> once every three months (as an upper bound ... sometimes we might release early if it makes sense). After the end of a release cycle, we will start preparing to cut a release. If there are small tweaks that need to be made or &quot;life happens&quot; ... we will happily postpone releases. But we won't hold releases back for &quot;big ticket&quot; items anymore.</p> +<p>We are balancing a lot of different concerns here:</p> +<ul> +<li>Building trust with Bevy contributors that their changes will land in a timely manner</li> +<li>Building trust with Bevy users that they will receive regular updates and bug fixes</li> +<li>Giving enough time between releases to cut down on churn in the Bevy Plugin ecosystem (Bevy isn't &quot;stable&quot; yet, but longer releases give reasonable windows of &quot;ecosystem stability&quot;)</li> +<li>Providing enough content in a release to generate &quot;hype&quot;. Bevy release blog posts tend to be a &quot;rallying cry&quot; for the community and I don't want to lose that.</li> +<li>Establishing proper work / life balance for core developers (crunch is bad!)</li> +</ul> +<p>We will refine this process over time and see what works best.</p> +<h3 id="more-renderer-features">More Renderer Features +<a class="anchor-link" href="#more-renderer-features">#</a> +</h3> +<ul> +<li><strong>Post-Processing Stack / HDR / Bloom</strong>: HDR and bloom <a href="https://github.com/bevyengine/bevy/pull/2876">almost made it into Bevy 0.6</a>, but we decided to hold them back so we can polish them a bit and build a proper &quot;modular post-processing stack&quot;.</li> +<li><strong>Skeletal Animation</strong>: Ultimately Bevy will have a general purpose, property based animation system (we already have a <a href="https://github.com/bevyengine/bevy/pull/1429">working implementation</a>). We've been holding off on adding skeletal animation, so we can slot it in to that system, but in retrospect that was a mistake. People need skeletal animation <em>now</em>. In the short term we will build a scoped 3d skeletal animation system, just to get the ball rolling. Then later we will port it to the general purpose system (whenever that is ready),</li> +<li><strong>Screen Space Ambient Occlusion (SSAO)</strong>: A popular and straightforward ambient occlusion approximation that can drastically improve render quality.</li> +<li><strong>Global Illumination</strong>: GI will provide a massive boost to the feel of &quot;realism&quot;, so it is worth prioritizing at least one form of GI in the short term. This is a complicated topic and will require experimentation.</li> +<li><strong>Compressed Textures</strong>: This will make scenes load faster and cut down on GPU memory usage.</li> +<li><strong>Shadow Filters and Cascades</strong>: Rob Swain (@superdump) has already done a lot of work in this area, so we will hopefully see that materialize in a Bevy release soon.</li> +<li><strong>PBR Shader Code Reuse</strong>: We will make it easier to define custom PBR shaders by making the PBR shader more modular and making it easier to import specific parts of the PBR shader.</li> +</ul> +<h3 id="ui-refresh">UI Refresh +<a class="anchor-link" href="#ui-refresh">#</a> +</h3> +<p>We will break ground on the Bevy Editor this year. To do that, we need a number of improvements to Bevy UI:</p> +<ul> +<li>Improved &quot;data driven UI&quot; (potentially &quot;reactive&quot;)</li> +<li>A solid set of pre-constructed widgets</li> +<li>Generally improved UX</li> +</ul> +<p>We now have a plethora of UI experiments in the Bevy community. Over the next few months we will refine our scope and begin the process of &quot;selecting a winner&quot;.</p> +<h3 id="asset-preprocessing">Asset Preprocessing +<a class="anchor-link" href="#asset-preprocessing">#</a> +</h3> +<p>Preprocessing assets is a critical part of a production game engine. It cuts down on startup times, reduces our CPU and GPU memory footprint, enables more complicated development workflows, makes it easier to ship assets with games, and cuts down on the final size of a deployed game. We've made it this far without an asset preprocessing system ... but barely. Solving this problem ASAP is a high priority for me.</p> +<h3 id="scene-improvements">Scene Improvements +<a class="anchor-link" href="#scene-improvements">#</a> +</h3> +<p>Nested scenes, property overrides, inline assets, and nicer syntax are all on the agenda. We already have a number of working experiments in these areas, so we should see relatively quick progress here.</p> +<h3 id="the-new-bevy-book">The New Bevy Book +<a class="anchor-link" href="#the-new-bevy-book">#</a> +</h3> +<p>The <a href="/learn/book/">current Bevy Book</a> is a great way to learn how to set up Bevy and dip your toes into writing Bevy Apps. But it barely scratches the surface of what Bevy can do.</p> +<p>To solve this problem @alice-i-cecile has <a href="https://github.com/bevyengine/bevy-website/pull/182">started working</a> on a new Bevy Book, with the goal of being a complete learning resource for Bevy. If you are interested in helping out, please reach out to them!</p> +<h3 id="the-bevy-monthly-newsletter">The Bevy Monthly Newsletter +<a class="anchor-link" href="#the-bevy-monthly-newsletter">#</a> +</h3> +<p><a href="/community/">The Bevy Community</a> is a vibrant and active place. Currently most community content is posted in the <code>#showcase</code> section of <a href="https://discord.gg/bevy">The Bevy Discord</a>. The upcoming Monthly Bevy Newsletter will be a consolidated, shareable resource that we will post to places like Reddit and Twitter.</p> +<h2 id="support-bevy">Support Bevy +<a class="anchor-link" href="#support-bevy">#</a> +</h2> +<p>Sponsorships help make my full time work on Bevy sustainable. If you believe in Bevy's mission, consider sponsoring me (@cart) ... every bit helps!</p> +<p><a class="button button--pink header__cta" href="https://github.com/sponsors/cart">Donate <img class="button__icon" src="/assets/heart.svg" alt="heart icon"/></a></p> +<h2 id="contributors">Contributors +<a class="anchor-link" href="#contributors">#</a> +</h2> +<p>A huge thanks to the <strong>170 contributors</strong> that made this release (and associated docs) possible! In random order:</p> +<ul> +<li>@bilsen</li> +<li>@jcornaz</li> +<li>@Guvante</li> +<li>@Weasy666</li> +<li>@jakobhellermann</li> +<li>@gfreezy</li> +<li>@MichaelHills</li> +<li>@tcmal</li> +<li>@temhotaokeaha</li> +<li>@nicopap</li> +<li>@dimitribobkov</li> +<li>@Newbytee</li> +<li>@TheRawMeatball</li> +<li>@marcospb19</li> +<li>@MarenFayre</li> +<li>@jleflang</li> +<li>@piedoom</li> +<li>@FlyingRatBull</li> +<li>@thomasheartman</li> +<li>@dburrows0</li> +<li>@squidboylan</li> +<li>@GarettCooper</li> +<li>@nside</li> +<li>@deprilula28</li> +<li>@Jbat1Jumper</li> +<li>@HackerFoo</li> +<li>@MatheusRich</li> +<li>@inodentry</li> +<li>@cryscan</li> +<li>@aleksator</li> +<li>@Toqozz</li> +<li>@concave-sphere</li> +<li>@jesseviikari</li> +<li>@dependabot</li> +<li>@zicklag</li> +<li>@mnett82</li> +<li>@guimcaballero</li> +<li>@lukors</li> +<li>@alice-i-cecile</li> +<li>@fintelia</li> +<li>@BoxyUwU</li> +<li>@gcoakes</li> +<li>@folke</li> +<li>@iwikal</li> +<li>@tsoutsman</li> +<li>@phrohdoh</li> +<li>@julhe</li> +<li>@Byteron</li> +<li>@TehPers</li> +<li>@andoco</li> +<li>@djeedai</li> +<li>@branan</li> +<li>@follower</li> +<li>@MiniaczQ</li> +<li>@terrarier2111</li> +<li>@joshuataylor</li> +<li>@CleanCut</li> +<li>@akiross</li> +<li>@rukai</li> +<li>@PaperCow</li> +<li>@CGMossa</li> +<li>@Josh015</li> +<li>@gschup</li> +<li>@james7132</li> +<li>@MyIsaak</li> +<li>@Hoidigan</li> +<li>@mccludav</li> +<li>@mnmaita</li> +<li>@sapir</li> +<li>@gilescope</li> +<li>@VVishion</li> +<li>@sarkahn</li> +<li>@fractaloop</li> +<li>@KDecay</li> +<li>@aloucks</li> +<li>@the-notable</li> +<li>@mirkoRainer</li> +<li>@Iaiao</li> +<li>@hymm</li> +<li>@jacobgardner</li> +<li>@Protowalker</li> +<li>@godsmith99x</li> +<li>@Weibye</li> +<li>@lberrymage</li> +<li>@anchpop</li> +<li>@willolisp</li> +<li>@trolleyman</li> +<li>@msklywenn</li> +<li>@deontologician</li> +<li>@johanhelsing</li> +<li>@memoryruins</li> +<li>@ahmedcharles</li> +<li>@vabka</li> +<li>@bytebuddha</li> +<li>@louisgjohnson</li> +<li>@r00ster91</li> +<li>@parasyte</li> +<li>@illuninocte</li> +<li>@jihiggins</li> +<li>@Dimev</li> +<li>@szunami</li> +<li>@tiagolam</li> +<li>@payload</li> +<li>@mrk-its</li> +<li>@Ixentus</li> +<li>@dintho</li> +<li>@CptPotato</li> +<li>@bjorn3</li> +<li>@CAD97</li> +<li>@lwansbrough</li> +<li>@Ratysz</li> +<li>@vgel</li> +<li>@dixonwille</li> +<li>@KirmesBude</li> +<li>@Tobenaii</li> +<li>@pbalcer</li> +<li>@msvbg</li> +<li>@Philipp-M</li> +<li>@Waridley</li> +<li>@StarArawn</li> +<li>@ickk</li> +<li>@IceSentry</li> +<li>@Lythenas</li> +<li>@Shatur</li> +<li>@Grindv1k</li> +<li>@aevyrie</li> +<li>@wilk10</li> +<li>@Davier</li> +<li>@timClicks</li> +<li>@DJMcNab</li> +<li>@r4gus</li> +<li>@rparrett</li> +<li>@mfdorst</li> +<li>@Veykril</li> +<li>@thebluefish</li> +<li>@forbjok</li> +<li>@bytemuck</li> +<li>@dbearden</li> +<li>@OptimisticPeach</li> +<li>@Weibye-Breach</li> +<li>@MrGVSV</li> +<li>@RichoDemus</li> +<li>@R3DP1XL</li> +<li>@jak6jak</li> +<li>@blaind</li> +<li>@YohDeadfall</li> +<li>@cart</li> +<li>@MinerSebas</li> +<li>@CrazyRoka</li> +<li>@NiklasEi</li> +<li>@superdump</li> +<li>@lassade</li> +<li>@yetanothercheer</li> +<li>@64kramsystem</li> +<li>@mockersf</li> +<li>@billyb2</li> +<li>@molikto</li> +<li>@mtsr</li> +<li>@Abhuu</li> +<li>@kumorig</li> +<li>@yilinwei</li> +<li>@Nilirad</li> +<li>@SarthakSingh31</li> +<li>@Frizi</li> +<li>@dataphract</li> +<li>@Sheepyhead</li> +<li>@simensgreen</li> +<li>@NathanSWard</li> +<li>@remilauzier</li> +<li>@fluffysquirrels</li> +</ul> +<h2 id="full-change-log">Full Change Log +<a class="anchor-link" href="#full-change-log">#</a> +</h2> +<h3 id="added">Added +<a class="anchor-link" href="#added">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/3175">New Renderer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3153">Clustered forward rendering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2861">Frustum culling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3060">Sprite Batching</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3428">Materials and MaterialPlugin</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3460">2D Meshes and Materials</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3039">WebGL2 support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3031">Pipeline Specialization, Shader Assets, and Shader Preprocessing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2831">Modular Rendering</a></li> +<li><a href="https://github.com/cart/bevy/pull/6">Directional light and shadow</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2112">Directional light</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2543">Use the infinite reverse right-handed perspective projection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2254">Implement and require <code>#[derive(Component)]</code> on all component structs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3137">Shader Imports. Decouple Mesh logic from PBR</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3072">Add support for opaque, alpha mask, and alpha blend modes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3553">bevy_gltf: Load light names from gltf</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3506">bevy_gltf: Add support for loading lights</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1901">Spherical Area Lights</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3290">Shader Processor: process imported shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2726">Add support for not casting/receiving shadows</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2700">Add support for configurable shadow map sizes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3296">Implement the <code>Overflow::Hidden</code> style property for UI</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2283">SystemState</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1763">Add a method <code>iter_combinations</code> on query to iterate over combinations of query results</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1395">Add FromReflect trait to convert dynamic types to concrete types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3041">More pipelined-rendering shader examples</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3452">Configurable wgpu features/limits priority</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3546">Cargo feature for bevy UI</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3498">Spherical area lights example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3318">Implement ReflectValue serialization for Duration</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3443">bevy_ui: register Overflow type</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3426">Add Visibility component to UI</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3415">Implement non-indexed mesh rendering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3416">add tracing spans for parallel executor and system overhead</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1925">RemoveChildren command</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3289">report shader processing errors in <code>RenderPipelineCache</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3291">enable Webgl2 optimisation in pbr under feature</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2695">Implement Sub-App Labels</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3395">Added <code>set_cursor_icon(...)</code> to <code>Window</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3349">Support topologies other than TriangleList</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3367">Add an example 'showcasing' using multiple windows</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2957">Add an example to draw a rectangle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3320">Added set_scissor_rect to tracked render pass.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2555">Add RenderWorld to Extract step</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3336">re-export ClearPassNode</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3325">add default standard material in PbrBundle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3166">add methods to get reads and writes of Access<T></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2903">Add despawn_children</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3281">More Bevy ECS schedule spans</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3105">Added transparency to window builder</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3257">Add Gamepads resource</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3206">Add support for #else for shader defs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2305">Implement iter() for mutable Queries</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3201">add shadows in examples</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3171">Added missing wgpu image render resources.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3126">Per-light toggleable shadow mapping</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3113">Support nested shader defs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2183">use bytemuck crate instead of Byteable trait</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3118"><code>iter_mut()</code> for Assets type</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3111">EntityRenderCommand and PhaseItemRenderCommand</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3070">add position to WindowDescriptor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3069">Add System Command apply and RenderGraph node spans</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2741">Support for normal maps including from glTF models</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3049">MSAA example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3042">Add MSAA to new renderer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2990">Add support for IndexFormat::Uint16</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2912">Apply labels to wgpu resources for improved debugging/profiling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2907">Add tracing spans around render subapp and stages</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2885">Add set_stencil_reference to TrackedRenderPass</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2855">Add despawn_recursive to EntityMut</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2832">Add trace_tracy feature for Tracy profiling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2819">Expose wgpu's StencilOperation with bevy</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2793">add get_single variant</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2778">Add builder methods to Transform</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2772">add get_history function to Diagnostic</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2760">Add convenience methods for checking a set of inputs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2581">Add error messages for the spooky insertions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2759">Add Deref implementation for ComputePipeline</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2740">Derive thiserror::Error for HexColorError</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2673">Spawn specific entities: spawn or insert operations, refactor spawn internals, world clearing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2631">Add ClearColor Resource to Pipelined Renderer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2682">remove_component for ReflectComponent</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2628">Added ComputePipelineDescriptor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2614">Added StorageTextureAccess to the exposed wgpu API</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2560">Add sprite atlases into the new renderer.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2542">Log adapter info on initialization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2397">Add feature flag to enable wasm for bevy_audio</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2345">Allow Option&lt;NonSend<T>&gt; and Option&lt;NonSendMut<T>&gt; as SystemParam</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2366">Added helpful adders for systemsets</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2360">Derive Clone for Time</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2641">Implement Clone for Fetches</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2718">Implement IntoSystemDescriptor for SystemDescriptor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2326">implement DetectChanges for NonSendMut</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2260">Log errors when loading textures from a gltf file</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2175">expose texture/image conversions as From/TryFrom</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2271">[ecs] implement is_empty for queries</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1007">Add audio to ios example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2180">Example showing how to use AsyncComputeTaskPool and Tasks</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2208">Expose set_changed() on ResMut and Mut</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2189">Impl AsRef+AsMut for Res, ResMut, and Mut</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2121">Add exit_on_esc_system to examples with window</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2084">Implement rotation for Text2d</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1831">Mesh vertex attributes for skinning and animation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1803">load zeroed UVs as fallback in gltf loader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2100">Implement direct mutable dereferencing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2053">add a span for frames</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2038">Add an alias mouse position -&gt; cursor position</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2024">Adding <code>WorldQuery</code> for <code>WithBundle</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2033">Automatic System Spans</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1909">Add system sets and run criteria example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1972">EnumVariantMeta derive</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1963">Added TryFrom for VertexAttributeValues</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1927">add render_to_texture example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1817">Added example of entity sorting by components</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1808">calculate flat normals for mesh if missing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1765">Add animate shaders example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1714">examples on how to tests systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1887">Add a UV sphere implementation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1878">Add additional vertex formats</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1828">gltf-loader: support data url for images</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1775">glTF: added color attribute support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1667">Add synonyms for transform relative vectors</a></li> +</ul> +<h3 id="changed">Changed +<a class="anchor-link" href="#changed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/2509">Relicense Bevy under the dual MIT or Apache-2.0 license</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2332">[ecs] Improve <code>Commands</code> performance</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2531">Merge AppBuilder into App</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3545">Use a special first depth slice for clustered forward rendering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3209">Add a separate ClearPass</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2704">bevy_pbr2: Improve lighting units and documentation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3577">gltf loader: do not use the taskpool for only one task</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2605">System Param Lifetime Split</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2398">Optional <code>.system</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2403">Optional <code>.system()</code>, part 2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2422">Optional <code>.system()</code>, part 3</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2431">Optional <code>.system()</code>, part 4 (run criteria)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2494">Optional <code>.system()</code>, part 6 (chaining)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3075">Make the <code>iter_combinators</code> examples prettier</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3551">Remove dead anchor.rs code</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1767">gltf: load textures asynchronously using io task pool</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3544">Use fully-qualified type names in Label derive.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3521">Remove Bytes, FromBytes, Labels, EntityLabels</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3495">StorageType parameter removed from ComponentDescriptor::new_resource</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3490">remove dead code: ShaderDefs derive</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3489">Enable Msaa for webgl by default</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3465">Renamed Entity::new to Entity::from_raw</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3448">bevy::scene::Entity renamed to bevy::scene::DynamicEntity.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3309">make <code>sub_app</code> return an <code>&amp;App</code> and add <code>sub_app_mut() -&gt; &amp;mut App</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3421">use ogg by default instead of mp3</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3420">enable <code>wasm-bindgen</code> feature on gilrs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3413">Use EventWriter for gilrs_system</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3401">Add some of the missing methods to <code>TrackedRenderPass</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3393">Only bevy_render depends directly on wgpu</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3375">Update wgpu to 0.12 and naga to 0.8</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3364">Improved bevymark: no bouncing offscreen and spawn waves from CLI</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3371">Rename render UiSystem to RenderUiSystem</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3335">Use updated window size in bevymark example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3337">Enable trace feature for subfeatures using it</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2989">Schedule gilrs system before input systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3260">Rename fixed timestep state and add a test</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2653">Port bevy_ui to pipelined-rendering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3193">update wireframe rendering to new renderer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3280">Allow <code>String</code> and <code>&amp;String</code> as <code>Id</code> for <code>AssetServer.get_handle(id)</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3282">Ported WgpuOptions to new renderer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2496">Down with the system!</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3244">Update dependencies <code>ron</code> <code>winit</code>&amp; fix <code>cargo-deny</code> lists</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3258">Improve contributors example quality</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3271">Expose command encoders</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3264">Made Time::time_since_startup return from last tick.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3270">Default image used in PipelinedSpriteBundle to be able to render without loading a texture</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3236">make texture from sprite pipeline filterable</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3109">iOS: replace cargo-lipo, and update for new macOS</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3182">increase light intensity in pbr example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3189">Faster gltf loader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3168">Use crevice std140_size_static everywhere</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3122">replace matrix swizzles in pbr shader with index accesses</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3097">Disable default features from <code>bevy_asset</code> and <code>bevy_ecs</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3076">Update tracing-subscriber requirement from 0.2.22 to 0.3.1</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3059">Update vendored Crevice to 0.8.0 + PR for arrays</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2887">change texture atlas sprite indexing to usize</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3038">Update derive(DynamicPlugin) to edition 2021</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3028">Update to edition 2021 on master</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2943">Add entity ID to expect() message</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2847">Use RenderQueue in BufferVec</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2890">removed unused RenderResourceId and SwapChainFrame</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2827">Unique WorldId</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2864">add_texture returns index to texture</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2880">Update hexasphere requirement from 4.0.0 to 5.0.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2411">enable change detection for hierarchy maintenance</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2850">Make events reuse buffers</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2807">Replace <code>.insert_resource(T::default())</code> calls with <code>init_resource::&lt;T&gt;()</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2785">Improve many sprites example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2748">Update glam requirement from 0.17.3 to 0.18.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2684">update ndk-glue to 0.4</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2632">Remove Need for Sprite Size Sync System</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2727">Pipelined separate shadow vertex shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2717">Sub app label changes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2672">Use Explicit Names for Flex Direction</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2703">Make default near plane more sensible at 0.1</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2690">Reduce visibility of various types and fields</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2601">Cleanup FromResources</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2598">Better error message for unsupported shader features Fixes #869</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2606">Change definition of <code>ScheduleRunnerPlugin</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2613">Re-implement Automatic Sprite Sizing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2623">Remove with bundle filter</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2578">Remove bevy_dynamic_plugin as a default</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2537">Port bevy_gltf to pipelined-rendering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2564">Bump notify to 5.0.0-pre.11</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2515">Add 's (state) lifetime to <code>Fetch</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2552">move bevy_core_pipeline to its own plugin</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2490">Refactor ECS to reduce the dependency on a 1-to-1 mapping between components and real rust types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2520">Inline world get</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2521">Dedupe move logic in remove_bundle and remove_bundle_intersection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2538">remove .system from pipelined code</a></li> +<li><a href="https://github.com/cart/bevy/pull/26">Scale normal bias by texel size</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2449">Make Remove Command's fields public</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2393">bevy_utils: Re-introduce <code>with_capacity()</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2244">Update rodio requirement from 0.13 to 0.14</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2207">Optimize Events::extend and impl std::iter::Extend</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2186">Bump winit to 0.25</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2181">Improve legibility of RunOnce::run_unsafe param</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2196">Update gltf requirement from 0.15.2 to 0.16.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2074">Move to smallvec v1.6</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2086">Update rectangle-pack requirement from 0.3 to 0.4</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2034">Make Commands public?</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1914">Monomorphize vrious things</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2015">Detect camera projection changes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1997">support assets of any size</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1977">Separate Query filter access from fetch access during initial evaluation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1965">Provide better error message when missing a render backend</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1945">par_for_each: split batces when iterating on a sparse query</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1936">Allow deriving <code>SystemParam</code> on private types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1919">Angle bracket annotated types to support generics</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1864">More detailed errors when resource not found</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1823">Moved events to ECS</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1796">Use a sorted Map for vertex buffer attributes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1786">Error message improvements for shader compilation/gltf loading</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1778">Rename Light =&gt; PointLight and remove unused properties</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1734">Override size_hint for all Iterators and add ExactSizeIterator where applicable</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1541">Change breakout to use fixed timestamp</a></li> +</ul> +<h3 id="fixed">Fixed +<a class="anchor-link" href="#fixed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/3581">Fix shadows for non-TriangleLists</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3534">Fix error message for the <code>Component</code> macro's <code>component</code> <code>storage</code> attribute.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3502">do not add plugin ExtractComponentPlugin twice for StandardMaterial</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3466">load spirv using correct API</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3441">fix shader compilation error reporting for non-wgsl shaders</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3461">bevy_ui: Check clip when handling interactions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3438">crevice derive macro: fix path to render_resource when importing from bevy</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2410">fix parenting of scenes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3411">Do not panic on failed setting of GameOver state in AlienCakeAddict</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3369">Fix minimization crash because of cluster updates.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3381">Fix custom mesh pipelines</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3378">Fix hierarchy example panic</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2848">Fix double drop in BlobVec::replace_unchecked (#2597)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3343">Remove vestigial derives</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3330">Fix crash with disabled winit</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3316">Fix clustering for orthographic projections</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3304">Run a clear pass on Windows without any Views</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3297">Remove some superfluous unsafe code</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3286">clearpass: also clear views without depth (2d)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3268">Check for NaN in <code>Camera::world_to_screen()</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3207">Fix sprite hot reloading in new renderer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3178">Fix path used by macro not considering that we can use a sub-crate</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3549">Fix torus normals</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3202">enable alpha mode for textures materials that are transparent</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3200">fix calls to as_rgba_linear</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3186">Fix shadow logic</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3192">fix: as_rgba_linear used wrong variant</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3101">Fix MIME type support for glTF buffer Data URIs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/3000">Remove wasm audio feature flag for 2021</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2977">use correct size of pixel instead of 4</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2992">Fix custom_shader_pipelined example shader</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2932">Fix scale factor for cursor position</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2953">fix window resize after wgpu 0.11 upgrade</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2964">Fix unsound lifetime annotation on <code>Query::get_component</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2894">Remove double Events::update in bevy-gilrs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2905">Fix bevy_ecs::schedule::executor_parallel::system span management</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2913">Avoid some format! into immediate format!</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2863">Fix panic on is_resource_* calls (#2828)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2858">Fix window size change panic</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2833">fix <code>Default</code> implementation of <code>Image</code> so that size and data match</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2784">Fix scale_factor_override in the winit backend</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2770">Fix breakout example scoreboard</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2757">Fix Option&lt;NonSend<T>&gt; and Option&lt;NonSendMut<T>&gt;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2550">fix missing paths in ECS SystemParam derive macro v2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2625">Add missing bytemuck feature</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2604">Update EntityMut's location in push_children() and insert_children()</a></li> +<li><a href="https://github.com/cart/bevy/pull/24">Fixed issue with how texture arrays were uploaded with write_texture.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2482">Don't update when suspended to avoid GPU use on iOS.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2177">update archetypes for run criterias</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2395">Fix AssetServer::get_asset_loader deadlock</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2409">Fix unsetting RenderLayers bit in without fn</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2370">Fix view vector in pbr frag to work in ortho</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2362">Fixes Timer Precision Error Causing Panic</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2310">[assets] Fix <code>AssetServer::get_handle_path</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2325">Fix bad bounds for NonSend SystemParams</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2300">Add minimum sizes to textures to prevent crash</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2226">[assets] set LoadState properly and more testing!</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2318">[assets] properly set <code>LoadState</code> with invalid asset extension</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2269">Fix Bevy crashing if no audio device is found</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2295">Fixes dropping empty BlobVec</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2280">[assets] fix Assets being set as 'changed' each frame</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2227">drop overwritten component data on double insert</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2278">Despawn with children doesn't need to remove entities from parents children when parents are also removed</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2221">reduce tricky unsafety and simplify table structure</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1875">Use bevy_reflect as path in case of no direct references</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2206">Fix Events::&lt;drain/clear&gt; bug</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2172">small ecs cleanup and remove_bundle drop bugfix</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2197">Fix PBR regression for unlit materials</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2176">prevent memory leak when dropping ParallelSystemContainer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2165">fix diagnostic length for asset count</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2126">Fixes incorrect <code>PipelineCompiler::compile_pipeline()</code> step_mode</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2011">Asset re-loading while it's being deleted</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2044">Bevy derives handling generics in impl definitions.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2045">Fix unsoundness in <code>Query::for_each_mut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/2036">Fix mesh with no vertex attributes causing panic</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1954">Fix alien_cake_addict: cake should not be at height of player's location</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1940">fix memory size for PointLightBundle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1929">Fix unsoundness in query component access</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1905">fixing compilation error on macos aarch64</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1899">Fix SystemParam handling of Commands</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1871">Fix IcoSphere UV coordinates</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1668">fix 'attempted to subtract with overflow' for State::inactives</a></li> +</ul> + + + + Bevy's First Birthday + 2021-08-10T00:00:00+00:00 + 2021-08-10T00:00:00+00:00 + + https://bevyengine.org/news/bevys-first-birthday/ + <p><a href="https://www.twitter.com/cart_cart">@cart</a> here (Bevy's creator, lead developer, and project manager) with some exciting news:</p> +<p>Today is Bevy's first birthday! And what a year it has been! Now seems like as good a time as any to look back on how far we've come, reflect a bit, and start thinking about what the next year of Bevy development will look like.</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. Bevy is also free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. We have a <a href="/learn/book/getting-started/">Quick Start Guide</a> and a <a href="https://bevyengine.org/learn/book/introduction/">Bevy Book</a>. You can also check out <a href="https://bevyengine.org/assets/">Bevy Assets</a> for a library of community-developed plugins, crates, games, and learning resources.</p> +<span id="continue-reading"></span><h2 id="a-year-of-milestones">A Year of Milestones +<a class="anchor-link" href="#a-year-of-milestones">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-first-birthday/milestones.svg" alt="milestones" /></p> +<ul> +<li><strong>August 10</strong>: <a href="/news/introducing-bevy/">Bevy 0.1</a> +<ul> +<li>Bevy's first public release! After months of working incognito, I released Bevy to the world. It was by no means complete, but it had most of the pillars in place to show the world what Bevy is (and could be): a modern and flexible renderer built on top of a modular Render Graph, a custom ECS with unrivaled ergonomics and competitive performance, 2D and 3D rendering features, asset handling, a modular app model that blurs the lines between engine developers and app developers, a custom UI system that integrates deeply with the engine, scenes, hot reloading, and blissfully productive iterative compile times.</li> +</ul> +</li> +<li><strong>August 19</strong>: <a href="/news/scaling-bevy/">Absolutely Wild Public Reception</a> +<ul> +<li>Just a week after release we became the 3rd most popular /r/rust post of all time, hit #2 on Hacker News, received 2,200 Github stars, merged pull requests from 26 new contributors, gained 644 Discord members, and received <a href="https://github.com/sponsors/cart">sponsorships</a> that brought us 37% of the way to our first funding goal.</li> +</ul> +</li> +<li><strong>August 20</strong>: <a href="https://github.com/sponsors/cart">Reached our first funding goal ($1500 / month)</a> +<ul> +<li><a href="https://twitter.com/BevyEngine/status/1296525644004593664">Embark became our first platinum sponsor</a>, which brought us past our first funding goal, allowing me to work on Bevy full time without eating into my savings. This honestly set the course for the rest of the year of Bevy development.</li> +</ul> +</li> +<li><strong>August 20</strong>: <a href="https://community.amethyst.rs/t/bevy-engine-addressing-the-elephant-in-the-room/">The Amethyst forum post: &quot;Bevy Engine - Addressing the elephant in the room&quot;</a> +<ul> +<li>This helped establish the strengths of each project and identified various collaboration areas, marking the beginning of a fruitful relationship between the two communities.</li> +</ul> +</li> +<li><strong>August 28</strong>: <a href="https://github.com/sponsors/cart">Reached our second funding goal ($2080 / month)</a> +<ul> +<li>As of this point, I'm making &quot;state of Washington minimum wage&quot; working on Bevy. This marks the point where I start thinking about building and managing Bevy as &quot;my job&quot;.</li> +</ul> +</li> +<li><strong>September 19</strong>: <a href="/news/bevy-0-2/">Bevy 0.2</a> +<ul> +<li>A month after the initial release we dropped another big one! This included a new async task system with significantly improved performance, initial Web platform support, parallel queries, a new transform system, joystick input, and some tasty Bevy ECS performance improvements.</li> +</ul> +</li> +<li><strong>November 3</strong>: <a href="/news/bevy-0-3/">Bevy 0.3</a> +<ul> +<li>Another month after Bevy 0.2 we had <em>another</em> big release! This one added initial Android and iOS support, WASM asset loading, touch input, asset reference counting, dependencies, and sub assets, GLTF scene loading, Bevy ECS query ergonomics, 100% lockless parallel ECS and other performance improvements, flexible mesh attributes, another transform system rewrite, gamepad settings, plugin groups, and dynamic window settings.</li> +</ul> +</li> +<li><strong>December 19</strong>: <a href="/news/bevy-0-4/">Bevy 0.4</a> +<ul> +<li>We somehow still managed to keep up the &quot;approximately once a month&quot; release cadence. We added a WebGL2 render backend, cross platform main functions, live shader reloading, flexible ECS parameter orders, simplified query filters, system inputs, outputs, and chaining, a more featureful and flexible ECS schedule implementation, &quot;fixed timesteps&quot;, states, gltf improvements, spawning scenes as children, dynamic linking for <em>drastically</em> faster iterative compile times, a new text layout implementation, renderer optimizations, a new rust reflection crate (filling a major gap in the rust ecosystem), 3d texture assets, logging and profiling, hidpi rendering, timer improvements, task system improvements, and apple silicon support.</li> +</ul> +</li> +<li><strong>April 6</strong>: <a href="/news/bevy-0-5/">Bevy 0.5</a> +<ul> +<li>The almost-one-release-a-month streak finally ended. But thats not because we slowed down our pace! This release was a big one. It added Physically Based Rendering (PBR), GLTF asset improvements, Bevy ECS V2: a complete from-scratch rewrite with a novel archetype/sparse-set hybrid storage model, an &quot;archetype graph&quot; for faster archetype changes, query caching, uber fast for-each iterators, a new system executor with system labels, explicit system ordering/dependencies, system sets, and increased parallelism, &quot;reliable&quot; change detection, and a full rewrite of the State system). We also added a rich text API, hidpi and 2d-world space text, world-to-screen coordinate conversions, a 3d orthographic camera and new scaling modes, flexible camera bindings in shaders, render layers, sprite flipping, color spaces, wireframe rendering, and more smaller tweaks that I don't have room for here.</li> +</ul> +</li> +<li><strong>April 14</strong>: <a href="https://github.com/bevyengine/rfcs">The Bevy RFC process is unveiled</a> +<ul> +<li>Inspired by the Rust RFC process, we added a way to collaboratively design and review Bevy APIs prior to implementing them. This generally isn't required, but for bigger changes it ensures we think deeply about what we are building, mitigates risk, and encodes designs and intents for future Bevy developers.</li> +</ul> +</li> +<li><strong>June 1</strong>: <a href="https://twitter.com/BevyEngine/status/1399891316939448320">First public release of Bevy Assets</a> +<ul> +<li><a href="https://bevyengine.org/assets/">Bevy Assets</a> is a public library of community developed Bevy plugins, crates, assets, games, and learning materials. The website is fed by structured toml files in the <a href="https://github.com/bevyengine/bevy-assets">bevy-assets repo</a>. It has its roots in the awesome-bevy repo, our old unstructured markdown document with a list of community projects. It is still hot off the presses, but we have big plans for it!</li> +</ul> +</li> +<li><strong>June 24</strong>: <a href="https://github.com/sponsors/cart">Reached our third funding goal ($4000 / month)</a> +<ul> +<li>Reaching this goal marked the point where I started thinking about Bevy as a career. I'm not making &quot;market rate&quot; for my skills and I'm still making less than 1/4th what I made as a Senior Software Engineer at Microsoft, but I'm no longer &quot;just breaking even&quot; and I'm starting to save some money.</li> +</ul> +</li> +<li><strong>August 2</strong>: <a href="https://twitter.com/cart_cart/status/1422393321394085888">Bevy hits 10,000 stars on Github</a> +<ul> +<li>I honestly can't believe we hit this so quickly.</li> +</ul> +</li> +<li><strong>August 10</strong>: Bevy is now one year old!</li> +</ul> +<h2 id="a-year-by-the-numbers">A Year By The Numbers +<a class="anchor-link" href="#a-year-by-the-numbers">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-first-birthday/numbers.svg" alt="numbers" /></p> +<ul> +<li><strong>255</strong> unique Bevy contributors on <a href="https://github.com/bevyengine">Github</a></li> +<li><strong>10,030</strong> <a href="https://github.com/bevyengine">Github</a> stars</li> +<li><strong>837</strong> forks on <a href="https://github.com/bevyengine">Github</a></li> +<li><strong>1,501</strong> pull requests (1060 merged) on <a href="https://github.com/bevyengine">Github</a></li> +<li><strong>1,112</strong> issues (609 closed) on <a href="https://github.com/bevyengine">Github</a></li> +<li><strong>1,895</strong> commits on <a href="https://github.com/bevyengine">Github</a></li> +<li><strong>153</strong> <a href="https://github.com/bevyengine/bevy/discussions">Github Discussions</a></li> +<li><strong>110</strong> <a href="https://bevyengine.org/assets/">Bevy Assets</a> (plugins, crates, games, apps, and learning materials)</li> +<li><strong>57,349</strong> downloads on <a href="https://crates.io/crates/bevy">crates.io</a></li> +<li><strong>93</strong> <a href="https://twitter.com/BevyEngine">@BevyEngine</a> retweets of Bevy community content on Twitter</li> +<li><strong>4,871</strong> <a href="https://discord.com/invite/bevy">Bevy Discord</a> members</li> +<li><strong>771</strong> community #showcase entries in the <a href="https://discord.com/invite/bevy">Bevy Discord</a></li> +<li><strong>420,250</strong> messages in the <a href="https://discord.com/invite/bevy">Bevy Discord</a></li> +</ul> +<h2 id="things-i-m-proud-of">Things I'm Proud Of +<a class="anchor-link" href="#things-i-m-proud-of">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-first-birthday/proud.svg" alt="proud" /></p> +<h3 id="our-engine"><em>Our</em> Engine +<a class="anchor-link" href="#our-engine">#</a> +</h3> +<p>I'm <em>so</em> happy that Bevy quickly went from being &quot;my engine&quot; to being &quot;our engine&quot;. It was beautiful to see so many people find passion projects in Bevy. Take a look at the feature author lists in the release blog posts (after Bevy 0.1). This community is <em>huge</em>, <em>wildly</em> productive, and <em>intensely</em> collaborative!</p> +<p>Our community is also extremely welcoming: we have an active <a href="https://github.com/bevyengine/bevy/discussions/categories/q-a">Github Q&amp;A platform</a> and <a href="https://discord.com/invite/bevy">#help channel</a> on Discord (with over 82,000 messages). If you haven't already, <a href="https://discord.com/invite/bevy">hop in to our Discord</a> and say hi!</p> +<h3 id="development-pace">Development Pace +<a class="anchor-link" href="#development-pace">#</a> +</h3> +<p>Just look at all of the releases above and the sheer size of their feature sets! The upcoming Bevy 0.6 is gearing up to be another big one and I doubt we'll slow down any time soon. The results speak for themselves so I'll just shut up now.</p> +<h3 id="experimentation-and-iteration">Experimentation and Iteration +<a class="anchor-link" href="#experimentation-and-iteration">#</a> +</h3> +<p>We didn't just build things once and assume that was the best we could do. When we started <a href="/news/scaling-bevy/#what-made-bevy-good">I called out</a> that we needed the freedom to experiment and iterate. I put a big &quot;stability warning&quot; wherever I could to help manage expectations. And we sure did iterate! We <a href="https://bevyengine.org/news/bevy-0-2/#transform-system-rewrite">rewrote the transform system</a> ... <a href="https://bevyengine.org/news/bevy-0-3/#transform-re-rewrite">twice</a>. We <a href="https://bevyengine.org/news/bevy-0-5/#bevy-ecs-v2">completely rewrote Bevy ECS from scratch</a>, leaving our hecs ECS roots behind (but not forgotten). We have a <a href="https://github.com/bevyengine/bevy/issues/2535">brand new renderer</a> in the works. I've lost count of the number of &quot;next generation Bevy UI&quot; prototypes and designs people have put together.</p> +<p>I know the lack of stability has been tough for some people, but I think this is the only way to build The Best Game Engine™ in a collaborative way. Things will start to stabilize soon ... and the wait will be worth it I promise.</p> +<h3 id="the-bevy-app-model">The Bevy App Model +<a class="anchor-link" href="#the-bevy-app-model">#</a> +</h3> +<p>This year we invested heavily in what I call The Bevy App Model. Bevy + + + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_app&#x2F;latest&#x2F;bevy_app/struct.App.html"><code>App</code></a>s are easy to understand, ergonomic to write, and modular via + + + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_app&#x2F;latest&#x2F;bevy_app/trait.Plugin.html"><code>Plugin</code></a>s. My goal was to blur the lines between engine developers and app developers. I think we absolutely nailed it:</p> +<ol> +<li> +<p>There is no &quot;scripting interface&quot; separating &quot;engine logic&quot; from &quot;app logic&quot;. We use a single language (Rust) for the whole stack. Rust feels modern with &quot;high level&quot; niceties while retaining low level performance and control. In my opinion, Bevy Apps are often simpler and more expressive than high level equivalents like Unity or Godot, thanks to the state-of-the-art <a href="https://github.com/bevyengine/bevy/tree/main/crates/bevy_ecs">Bevy ECS</a>. And under the hood Bevy Apps <em>are</em> simpler because there are no internal translation layers between languages like C++ and scripting languages like C#:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-other z-rust">use</span> <span class="z-meta z-path z-rust">bevy<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">prelude<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-keyword z-operator z-arithmetic z-rust">*</span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This is a complete, self-contained, cross platform Bevy App +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>DefaultPlugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_startup_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>setup</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>greet_players</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Player</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">name</span><span class="z-punctuation z-separator z-type z-rust">:</span> String, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">setup</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Player <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + name<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Cart<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">greet_players</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> player <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">info!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>hello {}!<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> player<span class="z-punctuation z-accessor z-dot z-rust">.</span>name</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +</li> +<li> +<p>Bevy Engine &quot;internals&quot; are entirely implemented using the same App Model that &quot;app developers&quot; use. &quot;App developers&quot; <em>are</em> &quot;engine developers&quot;. &quot;Engine developers&quot; <em>are</em> &quot;app developers&quot;.</p> +</li> +</ol> +<p>As a result of (1), (2), and Bevy being free and open source, we foster a feeling of &quot;stack ownership&quot; that the other major players can't. Curious app developers can dig into Bevy's internals and feel immediately at home. The <a href="https://github.com/bevyengine/bevy/pulls"><em>thousands of pull requests</em></a> are a testament to that. We've seen an <a href="https://bevyengine.org/assets/#assets">explosion of third party plugins</a> being developed ranging from <a href="https://rapier.rs/">realistic physics</a> to <a href="https://github.com/StarArawn/bevy_ecs_tilemap">specialized tilemap renderers</a>. Bevy's modular nature enables app developers to mix and match the pieces they like and &quot;build their own engine&quot;. Bevy's core plugins like + + + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_asset&#x2F;latest&#x2F;bevy_asset/struct.AssetPlugin.html"><code>AssetPlugin</code></a> and + + + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_render&#x2F;latest&#x2F;bevy_render/struct.RenderPlugin.html"><code>RenderPlugin</code></a> provide a common ground to ensure + + + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_app&#x2F;latest&#x2F;bevy_app/trait.Plugin.html"><code>Plugin</code></a> interoperability. This composes nicely with the &quot;modular Render Graph&quot;, which makes for an extremely pluggable engine.</p> +<h3 id="bevy-ecs">Bevy ECS +<a class="anchor-link" href="#bevy-ecs">#</a> +</h3> +<p><strong>Content Warning</strong>: I'm going to boast a lot here and make some hard-to-verify claims, which might offend some peoples' sensibilities :)</p> +<p>Bevy ECS is the interface we use to build both engine features and apps, so it was natural to give it focus last year. I honestly don't think it is controversial to say that Bevy ECS has pushed the envelope of what an ECS can be. Bevy ECS is the &quot;secret sauce&quot; (well ... **cough** ... &quot;open sauce&quot;) that I believe uniquely positions us in the engine market. This is a result of meticulous experimentation, benchmarking, collaboration with other experts in the field, and unification of a lot of good ideas in the wider ECS ecosystem.</p> +<ul> +<li><strong>The <em>most ergonomic ECS</em> in existence</strong>. This might sound like hyperbole, but I haven't found any other offering in any language that can do what we do, as tersely as we do it. We <a href="https://bevyengine.org/news/introducing-bevy/#ergonomics">have</a> been <a href="https://github.com/bevyengine/bevy/pull/741">constantly</a> pushing <a href="https://github.com/bevyengine/bevy/pull/2398">the</a> envelope <a href="https://github.com/bevyengine/bevy/pull/1525">here</a>.</li> +<li><strong>Macro-free ergonomics</strong>. In Bevy we have an aversion to macros because they are DSLs (domain specific languages). We want to write <em>Rust</em>, not &quot;custom language we invented that happens to live inside Rust&quot;. Most ECS-es that approach our level of ergonomics do it via macros. By building Bevy ECS directly on the Rust type system, we ensure Bevy code is &quot;pure rust&quot;, the implementation is easier to debug, and users can extend it simply by implementing the relevant traits. This is one of our biggest innovations and I expect to see more projects learn from and adopt this model over time.</li> +<li><strong>The first hybrid Archetypal / Sparse Set ECS</strong>: We are the first ECS to support both Archetypal and Sparse Set storage, side-by-side. Prior to this, people selecting an ECS either needed to pick a Sparse Set ECS for faster component add/removes but slower query iteration, or an archetypal ECS for slower add/removes but faster query iteration. With Bevy ECS, developers can select what storage to use <em>per component</em>. Via some clever algorithms, we select the best iteration strategy for a given set of components. Credit goes to <a href="https://github.com/SanderMertens">@SanderMertens</a> (the author of <a href="https://github.com/SanderMertens/flecs">flecs</a>) for coming up with the initial idea and designs for this. After that, Sander and I spent a lot of time collaborating on implementation details. Bevy was &quot;first to market&quot; here, but flecs has plans to adopt a similar model (and plans to innovate on top of what we've done). This type of mutually beneficial cross project collaboration warms my heart. Why &quot;hold cards close to your chest&quot; and &quot;compete&quot; when you can collaboratively build things together? A rising tide lifts all boats.</li> +<li><strong>Lock-free Parallel ECS</strong>: We don't lock storages in Bevy ECS. When a System runs, it has full, unchecked, yet safe access to the data it pulls in. Everything is parallel by default. Everything Just Works™. You can easily define explicit before/after orderings between systems using System Labels, when that matters.</li> +<li><strong>Automatic / parallel / global change detection</strong>: All changes are cheaply and automatically tracked in Bevy. <em>And</em> they can be ergonomically queried. This enables an entire class of optimizations that aren't possible in other ECS implementations. To my knowledge, we are the first to do this. All of the alternatives I'm aware of are either imperfect at capturing changes, require manual opt-in boilerplate, or (generally) both. Compare <a href="https://medium.com/@5argon/unity-ecs-creating-an-efficient-system-with-chunk-iteration-didaddorchange-didchange-221427f5361b">Unity DOTs change detection</a> to <a href="https://github.com/bevyengine/bevy/tree/main/crates/bevy_ecs#change-detection">Bevy ECS change detection</a> to get a feel for the massive gulf we have crossed here.</li> +</ul> +<p>For those who think ECS is over-hyped ... I totally get it. ECS is <em>not</em> the only way to build a good engine. Anyone who tells you otherwise either has an agenda or hasn't thought enough about the problem yet. ECS is, however, one of the best ways to standardize data representation and flow in a modular context. This is a problem that <em>every</em> engine needs to solve and the results almost always end up looking <em>something</em> like ECS, even if they don't use that label. ECS is also an extremely broad category, to the point of being almost meaningless. If thinking about Bevy ECS as &quot;Bevy Data Layer&quot; makes you happier, that is a completely valid mindset! Our APIs extend beyond traditional ECS definitions (and <a href="https://github.com/bevyengine/bevy/pull/1627">we have plans to go further</a>). If you want to use an ECS-based engine because you've bought into the hype, I promise Bevy ECS can deliver :)</p> +<h3 id="github-popularity">Github Popularity +<a class="anchor-link" href="#github-popularity">#</a> +</h3> +<p>With over 10,000 stars, we are now the most popular Rust game engine on Github by a pretty wide margin. We are the <a href="https://github.com/topics/game-engine">8th most popular game engine on Github</a>. And Godot (currently holding the #1 spot with 40,900 stars) is starting to feel within our grasp, especially given their six year head start on us. If we make the same amount of progress next year, we'll be in the #2 spot! I'll be the first to say that popularity isn't everything. It isn't a measure of project maturity or feature set, but it <em>is</em> a measure of how many people we reach and resonate with. Winning hearts and minds is an important part of scaling an open source project. I'm proud of this progress and I hope the rest of the community is too.</p> +<h3 id="bevy-jobs">Bevy Jobs +<a class="anchor-link" href="#bevy-jobs">#</a> +</h3> +<p>We're starting to see paid Bevy jobs pop up and some of them are resulting in open-source contributions back to Bevy. This is the start of the next phase of Bevy's maturity: adoption by professionals. The &quot;stability warning&quot; still stands and studios should take that into account, but these developments excite me.</p> +<h2 id="there-is-always-room-for-improvement">There is Always Room for Improvement +<a class="anchor-link" href="#there-is-always-room-for-improvement">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-first-birthday/improve.svg" alt="improve" /></p> +<h3 id="delegating-work-and-responsibility">Delegating Work and Responsibility +<a class="anchor-link" href="#delegating-work-and-responsibility">#</a> +</h3> +<p>For most of this year, I worked very hard to maintain absolute control over every aspect of the project. This is just how I prefer to do things: I know what I want Bevy to be and I have pretty strong opinions about how that should be accomplished. I reviewed every pull request and design, read (almost) every issue and discord message, wrote every blog post, obsessed over every twitter message. This year was a long and painful process of learning what my limits are, watching the needs of the project grow past them, and then stubbornly refusing to let go in favor of burnout, letting things slip, or both at the same time.</p> +<p>Part of this was me being a control freak to an irrational extent. Part of this was fueled by a more rational desire to hold off delegation until I could build trust in the ethics and technical chops of other Bevy contributors. In retrospect, I waited way too long.</p> +<p>Fortunately, after learning lessons the hard way, I finally started delegating a bit. I created a <a href="https://github.com/orgs/bevyengine/teams/triage-team/members">Triage Team</a> and opened it up to interested Bevy contributors. I gave <a href="https://github.com/mockersf">@mockersf</a> the ability to merge small and relatively &quot;uncontroversial&quot; pull requests. <a href="https://github.com/alice-i-cecile">@alice-i-cecile</a> has been fantastic at wrangling issues and capturing and consolidating information. They're also heading up the new Bevy Book effort. <a href="https://github.com/Ratysz">@Ratysz</a> built and generally &quot;owns&quot; the new Bevy ECS scheduler. There are plenty of other people shouldering responsibility now ... but I've gotta stop the list somewhere.</p> +<p>I'm still learning how to delegate properly and I'm still not doing it enough. Bevy is growing rapidly and I promise I'll do my best to ensure I'm not the bottleneck going forward.</p> +<p>I don't plan on giving up my &quot;benevolent dictator&quot; status any time soon. Rest assured that I still intend to review (almost) all pull requests and strictly dictate the direction of the engine. But don't be surprised when you start seeing more people drive increasingly large efforts. Scaling out is the only way to allow Bevy to grow at the pace it needs to.</p> +<h3 id="project-planning-and-communicating-project-direction">Project Planning and Communicating Project Direction +<a class="anchor-link" href="#project-planning-and-communicating-project-direction">#</a> +</h3> +<p>Immediately after the initial Bevy release, I <a href="https://bevyengine.org/news/scaling-bevy/#focus-focus-focus">said we needed to focus</a>. I outlined three <a href="https://github.com/bevyengine/bevy/labels/focus-area">focus-areas</a> for us:</p> +<ul> +<li><a href="https://github.com/bevyengine/bevy/issues/255"><strong>Scenes</strong></a>: better scene format, inline assets, enabling / disabling systems</li> +<li><a href="https://github.com/bevyengine/bevy/issues/179"><strong>PBR / Clustered Forward Rendering</strong></a>: PBR shaders, HDR, bloom, shadowing, all using clustered-forward rendering</li> +<li><a href="https://github.com/bevyengine/bevy/issues/254"><strong>Editor-Ready UI</strong></a>: iterate on the current Bevy UI, add a canvas style drawing API, implement core widgets, theme-ability</li> +</ul> +<p>If you have been paying any attention to what we've built over the past year, we clearly <em>haven't</em> focused exclusively on these things, and in some cases chose to go in completely different directions. Here is what we <em>actually</em> focused on (at various points during the year):</p> +<ul> +<li><strong>Bevy ECS and The Bevy App Model</strong>: core rewrite, smarter and more featureful parallel scheduler, states, ergonomics, change detection, performance improvements</li> +<li><strong>PBR and GLTF</strong>: Success! We got one ... but only if you pretend &quot;clustered&quot; wasn't in the focus-area title and ignore HDR, bloom, and shadowing!</li> +<li><strong>Renderer</strong>: old renderer optimizations and features, new renderer (will be released in the upcoming Bevy 0.6)</li> +<li><strong>Platform support</strong> (iOS, Android, Web, as well as Desktop OS improvements)</li> +</ul> +<p>We did make small iterative improvements to Scenes, but we barely scratched the surface of the topics in the focus-area issue. I no longer think enabling/disabling systems from within scenes is a good idea. There are <a href="https://github.com/lassade/bevy_prefab">experiments covering the other topics</a>, but we clearly didn't &quot;focus&quot;. Editor-Ready UI has completely changed course. We plan on building a brand new API instead of building on what we have currently. This has seen a lot of design work and people are constantly experimenting, but again ... not our focus.</p> +<p>There was a clear mismatch in reported vs actual priorities, especially when it comes to how <em>I</em> spent my time. Many of you probably recall &quot;the time we focused on rewriting the ECS&quot;, &quot;the time we focused on PBR&quot;, or &quot;the time we focused on the new renderer&quot; (aka right now). You won't remember &quot;the time we focused on Editor-Ready UI&quot;, because it hasn't happened yet. This created problems for people who did try to break ground on these topics. They were free to experiment on their own, but without me investing time in building or &quot;blessing&quot; designs (because I <em>insist</em> on having the final say on these things), interested and motivated developers ended up &quot;directionless&quot;.</p> +<p>I believe we focused on the right things. We had more &quot;foundational&quot; work to do than I accounted for. Over time we all realized what the real focus areas <em>should</em> be, but we never got around to &quot;reporting that out&quot;.</p> +<p>Going forward I plan on changing my approach to focus areas in the following ways:</p> +<ul> +<li>We will have one or <em>maaaybe</em> two focus areas at a time, according to the number of unknowns and our &quot;bandwidth&quot;.</li> +<li>I will acknowledge that focus areas <em>need</em> immediate investment from me personally, for as long as I choose to occupy the &quot;benevolent dictator&quot; role. If I'm not actively working to unblock people from moving forward, it can't be a focus area (by definition).</li> +<li>If for whatever reason our focus needs to change when we discover new information, I will immediately report that out via a &quot;focus area change&quot;.</li> +</ul> +<h3 id="the-old-renderer-s-mid-level-apis">The Old Renderer's Mid Level APIs +<a class="anchor-link" href="#the-old-renderer-s-mid-level-apis">#</a> +</h3> +<p>The old renderer (pre Bevy 0.6) did a number of things right:</p> +<ul> +<li>User-friendly ECS-driven high level apis for custom shaders with very little boilerplate. For example, check out this <a href="https://github.com/bevyengine/bevy/blob/main/examples/shader/shader_custom_material.rs">&quot;custom shader material&quot; app</a></li> +<li>A modular &quot;low level&quot; Render Graph that enabled developers to easily slot new features into the render pipeline without centralized top-level orchestration, or to create entirely new render pipelines.</li> +</ul> +<p>However the mid-level apis between the render graph and the high level apis were complicated, full of abstractions and jargon, and in some cases, inefficient. As a result, this made the system hard to reason about and new developers struggled to understand it. I attribute this largely to focusing on making the high level and low level apis &quot;good UX&quot; and treating the mid level apis as &quot;glue&quot;.</p> +<p>I consider the old design of the mid-level apis to be a pretty costly &quot;mistake&quot;. The new renderer will solve these problems, largely by flattening out abstractions and clarifying dataflow. I'm really excited about it. Live and learn I guess. Things are rarely perfect on your first try.</p> +<h3 id="issue-and-pull-request-response-times">Issue and Pull Request Response Times +<a class="anchor-link" href="#issue-and-pull-request-response-times">#</a> +</h3> +<p>I'm especially unhappy with how long it takes to merge PRs, especially those that make &quot;big&quot; changes. Part of this is intentionally tabling PRs in subject areas we aren't ready to commit time and brainpower to, but a lot of it is just a bandwidth / attention problem. I've been working with other core contributors to build systems that streamline this process:</p> +<ul> +<li>Giving merge rights to a small group of trusted and capable people. Currently this is just <a href="https://github.com/mockersf">@mockersf</a> and is scoped to &quot;uncontroversial&quot; prs.</li> +<li>A &quot;community review system&quot; that forces a PR into my &quot;high priority review queue&quot; when there are enough approvals from the community.</li> +</ul> +<p>I don't think we've seen these systems work at their full capacity yet, as some of them are new and we're currently prioritizing preparing for the Bevy 0.6 release. Thousands of merged PRs a year <em>is</em> something to be proud of, but volume of pull requests is only going to get larger going forward. We need to be able to accommodate that.</p> +<h3 id="filling-niches">Filling Niches +<a class="anchor-link" href="#filling-niches">#</a> +</h3> +<p>At this stage of development, Bevy is capable of building most classes of apps (2d, 3d, ui-focused, etc). However we aren't yet &quot;competitive&quot; in any of these niches. For example, for 2D workflows our tilesets are pretty limited, we're missing important optimizations like sprite batching, and we don't have a visual editor for building levels. These things can be built as third party plugins (and in fact, <a href="https://github.com/StarArawn/bevy_ecs_tilemap">they have been</a>), but Bevy needs to provide first class support out of the box. This past year we &quot;went wide&quot; and built up infrastructure to enable development in each niche, but going forward I want to see us focus on excelling in specific niches. This is largely just a matter of time as we build out features. But we need to be constantly aware of this: if we can't be the best at filling at least one niche, there is no point to any of this.</p> +<h3 id="i-m-not-drawing-enough-birds">I'm Not Drawing Enough Birds +<a class="anchor-link" href="#i-m-not-drawing-enough-birds">#</a> +</h3> +<p>Never thought I'd say those words but here we are. I have a pretty big backlog of &quot;custom Bevy bird avatar&quot; <a href="https://github.com/sponsors/cart">sponsorship rewards</a> to make for people. Some people have been waiting a <em>long time</em> for theirs. I honestly regret adding this as a reward tier because it draws time away from me actually building Bevy (which I have clearly prioritized over making these avatars). I will likely retire this reward tier in the near future, but I promise I will get through the backlog for those that have already sponsored me at that tier. I am sincerely sorry for the delay.</p> +<h2 id="the-next-year-of-bevy">The Next Year of Bevy +<a class="anchor-link" href="#the-next-year-of-bevy">#</a> +</h2> +<p><img src="https://bevyengine.org/news/bevys-first-birthday/next_year.svg" alt="next year" /></p> +<p>Here are some of my plans for the next year:</p> +<ul> +<li><strong>Bevy 0.6</strong>: In the very near future we will release Bevy 0.6, which will include a brand new renderer that is drastically more efficient, more capable, easier to understand, and much more extensible. It draws inspiration from the <a href="https://advances.realtimerendering.com/destiny/gdc_2015/Tatarchuk_GDC_2015__Destiny_Renderer_web.pdf">Bungie / Destiny</a> and <a href="https://github.com/aclysma/rafx">rafx</a> architectures. This will include ports of all existing renderer features and initial implementations of features like shadows, viewports, material batching, and improved custom shaders.</li> +<li><strong>Asset Pipeline Maturity</strong>: The asset pipeline will get asset pre-processing, import configuration, and better dependency management. This will feed into renderer and scene improvements.</li> +<li><strong>Next Generation Bevy UI</strong>: We will build a new UI framework that takes advantage of Bevy ECS features, adds new features where necessary (such as &quot;reactivity&quot;), and makes UI development workflows more pleasant.</li> +<li><strong>The Bevy Editor</strong>: We will break ground on the Bevy Editor, which will be a Bevy App building on top of the &quot;next generation Bevy UI&quot;. We will start with scene editing functionality and then build out from there.</li> +<li><strong>Scene Improvements</strong>: Scenes will get support for nested scenes, a nicer scene file format, and property overloading</li> +<li><strong>The New Bevy Book</strong>: The current Bevy Book hasn't changed much since its initial release and doesn't cover much more than basic Bevy ECS usage. The new Book is already in progress and will be a much more comprehensive guide to all aspects of Bevy.</li> +<li><strong>New Bevy ECS Features</strong>: We will likely get some form of &quot;reactive ECS&quot;, entity-relationship indexing, and more granular and featureful parallel system scheduling</li> +<li><strong>Animation</strong>: We will build a unified animation system that makes 2D and 3D animation easier and integrates naturally with the Bevy Editor</li> +<li><strong>2D Features</strong>: Sprite batching, more tileset features, layers, visual / interactive tooling in the Bevy Editor</li> +<li><strong>3D Features</strong>: Skeletal animation (that integrates with the Animation system), configurable / flexible / good looking shadows, at least one form of global illumination, more PBR properties, and visual / interactive tooling in the Bevy Editor</li> +<li><strong>Bevy Game Jam</strong>: We will have at least one official Bevy Game Jam to promote Bevy, battle test apis, and give users more examples to build off of.</li> +</ul> +<p>I am relatively confident that we can make these things happen. We already have working prototypes for many of the features above and have started reaching consensus in a number of areas.</p> +<p>Here are some predictions about Bevy's trajectory over the next year:</p> +<ul> +<li>I expect the Bevy 0.6 release to be immediately followed by an uptick in advanced built-in and third party renderer features (as a result of the new renderer).</li> +<li>In relatively short order, I expect to see more people reaching for Bevy as their preferred choice for 2D apps, thanks to improved tooling and performance.</li> +<li>By the end of the year, I expect people to start taking us seriously for 3D applications, thanks to a solid set of built in &quot;advanced rendering features&quot; and our extremely competitive renderer modularity.</li> +<li>I expect the number of people getting paid to develop Bevy Engine, build Bevy apps, and make Bevy content to go way up.</li> +<li>If the &quot;Next Generation Bevy UI&quot; effort is successful, people wanting to build &quot;Rust GUI apps&quot; will start reaching for Bevy.</li> +<li>We will break out of the &quot;Rust gamedev enthusiast&quot; circles. By the end of the year, Bevy will be brought up more regularly in the wider gamedev community alongside conversations about Unity, Unreal, and Godot. Not necessarily as a <em>direct</em> competitor yet, but as a viable alternative for people that (1) want something new / innovative / different and (2) are willing to work around a smaller feature set and slightly less stable apis.</li> +</ul> +<p>If any of this excites you, we would love your help! Check out our code on <a href="https://github.com/bevyengine/bevy">Github</a>, start participating in the <a href="https://bevyengine.org/community/">Bevy Community</a>, and consider <a href="https://github.com/sponsors/cart">sponsoring my work</a> to ensure I can continue building and leading this wildly ambitious project.</p> +<p>I'm looking forward to spending the next year with you all!</p> +<p>- <a href="https://github.com/cart/">@cart</a></p> +<img src="/assets/bevy_logo_dark.svg" style="height: 4.0rem; margin-top: 1.5rem" /> + + + + Bevy 0.5 + 2021-04-06T00:00:00+00:00 + 2021-04-06T00:00:00+00:00 + + https://bevyengine.org/news/bevy-0-5/ + <p>Thanks to <strong>88</strong> contributors, <strong>283</strong> pull requests, and our <a href="https://github.com/sponsors/cart"><strong>generous sponsors</strong></a>, I'm happy to announce the <strong>Bevy 0.5</strong> release on <a href="https://crates.io/crates/bevy">crates.io</a>!</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out <a href="/learn/book/getting-started/">Quick Start Guide</a> to get started. Bevy is also free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub. Check out <a href="https://github.com/bevyengine/awesome-bevy">Awesome Bevy</a> for a list of community-developed plugins, games, and learning resources.</p> +<p><strong>Bevy 0.5</strong> is quite a bit bigger than our past few releases (and took a bit longer) as we have made a number of foundational changes. If you plan on updating your App or Plugin to <strong>Bevy 0.5</strong>, check out our <a href="/learn/migration-guides/0.4-0.5/">0.4 to 0.5 Migration Guide</a>.</p> +<p>Here are some of the highlights from this release:</p> +<span id="continue-reading"></span><h2 id="physically-based-rendering-pbr">Physically Based Rendering (PBR) +<a class="anchor-link" href="#physically-based-rendering-pbr">#</a> +</h2> +<div class="release-feature-authors">authors: @StarArawn, @mtsr, @mockersf, @IngmarBitter, @Josh015, @norgate, @cart</div> +<p>Bevy now uses PBR shaders when rendering. PBR is a semi-standard approach to rendering that attempts to use approximations of real-world &quot;physically based&quot; lighting and material properties. We largely use techniques from the <a href="https://github.com/google/filament/">Filament</a> PBR implementation, but we also incorporate some ideas from <a href="https://www.unrealengine.com/en-US/blog/physically-based-shading-on-mobile">Unreal</a> and <a href="https://google.github.io/filament/Filament.html#citation-burley12">Disney</a>.</p> +<p>Bevy's <code>StandardMaterial</code> now has <code>base_color</code>, <code>roughness</code>, <code>metallic</code>, <code>reflection</code>, and <code>emissive</code> properties. It also now supports textures for <code>base_color</code>, <code>normal_map</code>, <code>metallic_roughness</code>, <code>emissive</code>, and <code>occlusion</code> properties.</p> +<p>The new PBR example helps visualize these new material properties:</p> +<p><img src="https://bevyengine.org/news/bevy-0-5/pbr.png" alt="pbr" /></p> +<h2 id="gltf-improvements">GLTF Improvements +<a class="anchor-link" href="#gltf-improvements">#</a> +</h2> +<h3 id="pbr-textures">PBR Textures +<a class="anchor-link" href="#pbr-textures">#</a> +</h3> +<div class="release-feature-authors">authors: @mtsr, @mockersf</div> +<p>The GLTF loader now supports normal maps, metallic/roughness, occlusion, and emissive textures. Our &quot;flight helmet&quot; gltf example utilizes the new PBR texture support and looks much nicer as a result:</p> +<p><video controls loop><source src="flighthelmet.mp4" type="video/mp4"/></video></p> +<h3 id="top-level-gltf-asset">Top-Level GLTF Asset +<a class="anchor-link" href="#top-level-gltf-asset">#</a> +</h3> +<div class="release-feature-authors">authors: @mockersf</div> +<p>Previously it was hard to interact with GLTF assets because scenes / meshes / textures / and materials were only loaded as &quot;sub assets&quot;. Thanks to the new top level + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_gltf&#x2F;0.5.0&#x2F;bevy_gltf/struct.Gltf.html"><code>Gltf</code></a> asset type, it is now possible to navigate the contents of the GLTF asset:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> load GLTF asset on startup +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">setup</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, <span class="z-variable z-parameter z-rust">assets</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> handle <span class="z-keyword z-operator z-assignment z-rust">=</span> assets<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>flight_helmet.gltf<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> access GLTF asset at some later point in time +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">handle</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Gltf<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">gltfs</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Gltf<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">materials</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>StandardMaterial<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> gltf <span class="z-keyword z-operator z-assignment z-rust">=</span> gltfs<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-storage z-type z-rust">let</span> material_handle <span class="z-keyword z-operator z-assignment z-rust">=</span> gltf<span class="z-punctuation z-accessor z-dot z-rust">.</span>named_materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>MetalPartsMat<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-storage z-type z-rust">let</span> material <span class="z-keyword z-operator z-assignment z-rust">=</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>material_handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="bevy-ecs-v2">Bevy ECS V2 +<a class="anchor-link" href="#bevy-ecs-v2">#</a> +</h2> +<p>This release marks a huge step forward for Bevy's ECS. It has significant implications for how Bevy Apps are composed and how well they perform:</p> +<ul> +<li><strong><a href="https://bevyengine.org/news/bevy-0-5/#ecs-core-rewrite">A full rewrite of the ECS core:</a></strong> +<ul> +<li>Massively improved performance across the board</li> +<li>&quot;Hybrid&quot; component storage</li> +<li>An &quot;Archetype Graph&quot; for faster archetype changes</li> +<li>Stateful queries that cache results across runs</li> +</ul> +</li> +<li><strong><a href="https://bevyengine.org/news/bevy-0-5/#new-parallel-system-executor">A brand new parallel System executor:</a></strong> +<ul> +<li>Support for explicit system ordering</li> +<li>System Labels</li> +<li>System Sets</li> +<li>Improved system &quot;run criteria&quot;</li> +<li>Increased system parallelism</li> +</ul> +</li> +<li><strong><a href="https://bevyengine.org/news/bevy-0-5/#reliable-change-detection">&quot;Reliable&quot; change detection:</a></strong> +<ul> +<li>Systems will now always detect component changes, even across frames</li> +</ul> +</li> +<li><strong><a href="https://bevyengine.org/news/bevy-0-5/#states-v2">A rewrite of the State system:</a></strong> +<ul> +<li>A much more natural &quot;stack-based state machine&quot; model</li> +<li>Direct integration with the new scheduler</li> +<li>Improved &quot;state lifecycle&quot; events</li> +</ul> +</li> +</ul> +<p>Read on for the details!</p> +<h2 id="ecs-core-rewrite">ECS Core Rewrite +<a class="anchor-link" href="#ecs-core-rewrite">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>Up until this point, Bevy used a heavily forked version of <a href="https://github.com/Ralith/hecs">hecs</a> for our ECS core. Since Bevy's first release, we've learned a lot about Bevy's ECS needs. We've also collaborated with other ECS project leaders, such as <a href="https://github.com/SanderMertens">Sander Mertens</a> (lead <a href="https://github.com/SanderMertens/flecs">flecs</a> developer) and <a href="https://github.com/gjroelofs">Gijs-Jan Roelofs</a> (Xenonauts ECS framework developer). As an &quot;ECS community&quot;, we've started to zero in on what the future of ECS could be.</p> +<p>Bevy ECS v2 is our first step into that future. It also means that Bevy ECS is no longer a &quot;hecs fork&quot;. We are going out on our own!</p> +<h3 id="component-storage-the-problem">Component Storage (The Problem) +<a class="anchor-link" href="#component-storage-the-problem">#</a> +</h3> +<p>Two ECS storage paradigms have gained a lot of traction over the years:</p> +<ul> +<li><strong>Archetypal ECS</strong>: +<ul> +<li>Stores components in &quot;tables&quot; with static schemas. Each &quot;column&quot; stores components of a given type. Each &quot;row&quot; is an entity.</li> +<li>Each &quot;archetype&quot; has its own table. Adding/removing an entity's component changes the archetype.</li> +<li>Enables super-fast Query iteration due to its cache-friendly data layout</li> +<li>Comes at the cost of more expensive add/remove operations for an Entity's components, because all components need to be copied to the new archetype's &quot;table&quot;</li> +<li>Parallelism-friendly: entities only exist in one archetype at a time so systems that access the same components but in different archetypes can run in parallel</li> +<li>Frameworks: Old Bevy ECS, hecs, legion, flecs, Unity DOTS</li> +</ul> +</li> +<li><strong>Sparse Set ECS</strong>: +<ul> +<li>Stores components of the same type in densely packed arrays, which are sparsely indexed by densely packed unsigned integers (entity ids)</li> +<li>Query iteration is slower than Archetypal ECS (by default) because each entity's component could be at any position in the sparse set. This &quot;random access&quot; pattern isn't cache friendly. Additionally, there is an extra layer of indirection because you must first map the entity id to an index in the component array.</li> +<li>Adding/removing components is a cheap, constant time operation</li> +<li>&quot;Component Packs&quot; are used to optimize iteration performance on a case by case basis (but packs conflict with each other)</li> +<li>Less parallelism friendly: systems need to either lock a whole component storage (not granular) or individual entities (expensive)</li> +<li>Frameworks: Shipyard, EnTT</li> +</ul> +</li> +</ul> +<p>Developers selecting an ECS framework are stuck with a hard choice. Select an &quot;archetypal&quot; framework with &quot;fast iteration everywhere&quot; but without the ability to cheaply add/remove components, or select a &quot;sparse set&quot; framework to cheaply add/remove components but with slower iteration performance or manual (and conflicting) pack optimizations.</p> +<h3 id="hybrid-component-storage-the-solution">Hybrid Component Storage (The Solution) +<a class="anchor-link" href="#hybrid-component-storage-the-solution">#</a> +</h3> +<p>In Bevy ECS V2, we get to have our cake and eat it too. It now has <em>both</em> of the component storage types above (and more can be added later if needed):</p> +<ul> +<li><strong>Tables</strong> (aka &quot;archetypal&quot; storage in other frameworks) +<ul> +<li>The default storage. If you don't configure anything, this is what you get</li> +<li>Fast iteration by default</li> +<li>Slower add/remove operations</li> +</ul> +</li> +<li><strong>Sparse Sets</strong> +<ul> +<li>Opt-in</li> +<li>Slower iteration</li> +<li>Faster add/remove operations</li> +</ul> +</li> +</ul> +<p>These storage types complement each other perfectly. By default Query iteration is fast. If developers know that they want to add/remove a component at high frequencies, they can set the storage to &quot;sparse set&quot;:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">register_component</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-path z-rust">ComponentDescriptor<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">new<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyComponent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">StorageType<span class="z-punctuation z-accessor z-rust">::</span></span>SparseSet</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h4 id="component-add-remove-benchmark-in-milliseconds-less-is-better">Component Add/Remove Benchmark (in milliseconds, less is better) +<a class="anchor-link" href="#component-add-remove-benchmark-in-milliseconds-less-is-better">#</a> +</h4> +<p>This benchmark illustrates adding and removing a single 4x4 matrix component 10,000 times from an entity that has 5 other 4x4 matrix components. The &quot;other&quot; components are included to help illustrate the cost of &quot;table storage&quot; (used by Bevy 0.4, Bevy 0.5 (Table), and Legion), which requires moving the &quot;other&quot; components to a new table.</p> +<p><img src="https://bevyengine.org/news/bevy-0-5/add_remove_big.svg" alt="component add/remove" /></p> +<p>You may have noticed that <strong>Bevy 0.5 (Table)</strong> is also <em>way</em> faster than <strong>Bevy 0.4</strong>, even though they both use &quot;table storage&quot;. This is largely a result of the new <a href="https://github.com/bevyengine/bevy/pull/1525">Archetype Graph</a>, which significantly cuts the cost of archetype changes.</p> +<h3 id="stateful-queries-and-system-parameters">Stateful Queries and System Parameters +<a class="anchor-link" href="#stateful-queries-and-system-parameters">#</a> +</h3> +<p> + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;world/struct.World.html"><code>World</code></a> queries (and other system parameters) are now stateful. This allows us to:</p> +<ol> +<li>Cache archetype (and table) matches +<ul> +<li>This resolves another issue with (naive) archetypal ECS: query performance getting worse as the number of archetypes goes up (and fragmentation occurs).</li> +</ul> +</li> +<li>Cache Query Fetch and Filter state +<ul> +<li>The expensive parts of fetch/filter operations (such as hashing the TypeId to find the ComponentId) now only happen once when the Query is first constructed</li> +</ul> +</li> +<li>Incrementally build up state +<ul> +<li>When new archetypes are added, we only process the new archetypes (no need to rebuild state for old archetypes)</li> +</ul> +</li> +</ol> +<p>As a result, the direct + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;world/struct.World.html"><code>World</code></a> query API now looks like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> query <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">query<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>A, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> B<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-modifier z-rust">mut</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> world</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>However for + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;system/trait.System.html"><code>System</code></a>s this is a non-breaking change. Query state management is done internally by the relevant SystemParam.</p> +<p>We have achieved some pretty significant performance wins as a result of the new Query system.</p> +<h4 id="sparse-fragmented-iterator-benchmark-in-nanoseconds-less-is-better">&quot;Sparse&quot; Fragmented Iterator Benchmark (in nanoseconds, less is better) +<a class="anchor-link" href="#sparse-fragmented-iterator-benchmark-in-nanoseconds-less-is-better">#</a> +</h4> +<p>This benchmark runs a query that matches 5 entities within a single archetype and <em>doesn't</em> match 100 other archetypes. This is a reasonable test of &quot;real world&quot; queries in games, which generally have many different entity &quot;types&quot;, most of which <em>don't</em> match a given query. This test uses &quot;table storage&quot; across the board.</p> +<p><img src="https://bevyengine.org/news/bevy-0-5/sparse_frag_iter.svg" alt="sparse_frag_iter" /></p> +<p><strong>Bevy 0.5</strong> marks a huge improvement for cases like this, thanks to the new &quot;stateful queries&quot;. <strong>Bevy 0.4</strong> needs to check every archetype each time the iterator is run, whereas <strong>Bevy 0.5</strong> amortizes that cost to zero.</p> +<h4 id="fragmented-iterator-benchmark-in-milliseconds-less-is-better">Fragmented Iterator Benchmark (in milliseconds, less is better) +<a class="anchor-link" href="#fragmented-iterator-benchmark-in-milliseconds-less-is-better">#</a> +</h4> +<p>This is the <a href="https://github.com/rust-gamedev/ecs_bench_suite">ecs_bench_suite</a> <code>frag_iter</code> benchmark. It runs a query on 27 archetypes with 20 entities each. However unlike the &quot;Sparse Fragmented Iterator Benchmark&quot;, there are no &quot;unmatched&quot; archetypes. This test uses &quot;table storage&quot; across the board.</p> +<p><img src="https://bevyengine.org/news/bevy-0-5/frag_iter.svg" alt="frag_iter" /></p> +<p>The gains here compared to the last benchmark are smaller because there aren't any unmatched archetypes. However <strong>Bevy 0.5</strong> still gets a nice boost due to better iterator/query impls, amortizing the cost of matched archetypes to zero, and for_each iterators.</p> +<h3 id="uber-fast-for-each-query-iterators">Uber Fast &quot;for_each&quot; Query Iterators +<a class="anchor-link" href="#uber-fast-for-each-query-iterators">#</a> +</h3> +<p>Developers now have the choice to use a fast + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;system/struct.Query.html#method.for_each"><code>Query::for_each()</code></a> iterator, which yields ~1.5-3x iteration speed improvements for &quot;fragmented iteration&quot;, and minor ~1.2x iteration speed improvements for unfragmented iteration.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>A, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> B<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> you now have the option to do this for a speed boost +</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">for_each_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-variable z-parameter z-rust">a</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-variable z-parameter z-rust">mut</span> <span class="z-variable z-parameter z-rust">b</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> however normal iterators are still available +</span> <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-modifier z-rust">mut</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>We will continue to encourage &quot;normal&quot; iterators as they are more flexible and more &quot;rust idiomatic&quot;. But when that extra &quot;oomf&quot; is needed, <code>for_each</code> will be there ... waiting for you :)</p> +<h2 id="new-parallel-system-executor">New Parallel System Executor +<a class="anchor-link" href="#new-parallel-system-executor">#</a> +</h2> +<div class="release-feature-authors">authors: @Ratysz</div> +<p>Bevy's old parallel executor had a number of fundamental limitations:</p> +<ol> +<li>The only way to explicitly define system order was to create new stages. This was both boilerplate-ey and prevented parallelism (because stages run &quot;one by one&quot; in order). We've noticed that system ordering is a common requirement and stages just weren't cutting it.</li> +<li>Systems had &quot;implicit&quot; orderings when they accessed conflicting resources. These orderings were hard to reason about.</li> +<li>The &quot;implicit orderings&quot; produced execution strategies that often left a lot of parallelism potential on the table.</li> +</ol> +<p>Fortunately @Ratysz has been <a href="https://ratysz.github.io/article/scheduling-1/">doing</a> a lot of <a href="https://github.com/Ratysz/yaks/">research</a> in this area and volunteered to contribute a new executor. The new executor solves all of the issues above and also adds a bunch of new usability improvements. The &quot;ordering&quot; rules are now dead-simple:</p> +<ol> +<li>Systems run in parallel by default</li> +<li>Systems with explicit orderings defined will respect those orderings</li> +</ol> +<h3 id="explicit-system-dependencies-and-system-labels">Explicit System Dependencies and System Labels +<a class="anchor-link" href="#explicit-system-dependencies-and-system-labels">#</a> +</h3> +<div class="release-feature-authors">authors: @Ratysz, @TheRawMeatball</div> +<p>Systems can now be assigned one or more + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;schedule/trait.SystemLabel.html"><code>SystemLabel</code></a>s. These labels can then be referenced by other systems (within a stage) to run before or after systems with that label:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>update_velocity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>velocity<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The &quot;movement&quot; system will run after &quot;update_velocity&quot; +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>velocity<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This produces an equivalent ordering, but it uses <code>before()</code> instead.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The &quot;update_velocity&quot; system will run before &quot;movement&quot; +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>update_velocity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">before</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>movement<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>movement<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Any type that implements the + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;schedule/trait.SystemLabel.html"><code>SystemLabel</code></a> trait can be used. In most cases we recommend defining custom types and deriving + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;schedule/trait.SystemLabel.html"><code>SystemLabel</code></a> for them. This prevents typos, allows for encapsulation (when needed), and allows IDEs to autocomplete labels:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Debug<span class="z-punctuation z-separator z-rust">,</span> Hash<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Eq<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> SystemLabel</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">PhysicsSystem</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + UpdateVelocity<span class="z-punctuation z-separator z-rust">,</span> + Movement<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>update_velocity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSystem<span class="z-punctuation z-accessor z-rust">::</span></span>UpdateVelocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSystem<span class="z-punctuation z-accessor z-rust">::</span></span>Movement</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSystem<span class="z-punctuation z-accessor z-rust">::</span></span>UpdateVelocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="many-to-many-system-labels">Many-to-Many System Labels +<a class="anchor-link" href="#many-to-many-system-labels">#</a> +</h3> +<p>Many-to-many labels is a powerful concept that makes it easy to take a dependency on many systems that produce a given behavior/outcome. For example, if you have a system that needs to run after all &quot;physics&quot; has finished updating (see the example above), you could label all &quot;physics systems&quot; with the same <code>Physics</code> label:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Debug<span class="z-punctuation z-separator z-rust">,</span> Hash<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Eq<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> SystemLabel</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Physics</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Debug<span class="z-punctuation z-separator z-rust">,</span> Hash<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Eq<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> SystemLabel</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">PhysicsSystem</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + UpdateVelocity<span class="z-punctuation z-separator z-rust">,</span> + Movement<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>update_velocity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSystem<span class="z-punctuation z-accessor z-rust">::</span></span>UpdateVelocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Physics</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSystem<span class="z-punctuation z-accessor z-rust">::</span></span>Movement</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Physics</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSystem<span class="z-punctuation z-accessor z-rust">::</span></span>UpdateVelocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>runs_after_physics<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Physics</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Bevy plugin authors should export labels like this in their public APIs to enable their users to insert systems before/after logic provided by the plugin.</p> +<h3 id="system-sets">System Sets +<a class="anchor-link" href="#system-sets">#</a> +</h3> +<p> + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;schedule/struct.SystemSet.html"><code>SystemSet</code></a>s are a new way to apply the same configuration to a group of systems, which significantly cuts down on boilerplate. The &quot;physics&quot; example above could be rephrased like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SystemSet<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this label is added to all systems in the set +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Physics</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>update_velocity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSystem<span class="z-punctuation z-accessor z-rust">::</span></span>UpdateVelocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSystem<span class="z-punctuation z-accessor z-rust">::</span></span>Movement</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PhysicsSystem<span class="z-punctuation z-accessor z-rust">::</span></span>UpdateVelocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>SystemSets can also use <code>before(Label)</code> and <code>after(Label)</code> to run all systems in the set before/after the given label.</p> +<p>This is also very useful for groups of systems that need to run with the same + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;schedule/struct.RunCriteria.html"><code>RunCriteria</code></a>.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> all systems in this set will run once every two seconds +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SystemSet<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_run_criteria</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">FixedTimestep<span class="z-punctuation z-accessor z-rust">::</span></span>step<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>bar<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h3 id="improved-run-criteria">Improved Run Criteria +<a class="anchor-link" href="#improved-run-criteria">#</a> +</h3> +<p>Run Criteria are now decoupled from systems and will be re-used when possible. For example, the FixedTimestep criteria in the example above will only be run once per stage run. The executor will re-use the criteria's result for both the <code>foo</code> and <code>bar</code> system.</p> +<p>Run Criteria can now also be labeled and referenced by other systems:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">every_other_time</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">has_ran</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Local<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">bool</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> ShouldRun</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-operator z-arithmetic z-rust">*</span>has_ran <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-keyword z-operator z-logical z-rust">!</span><span class="z-keyword z-operator z-arithmetic z-rust">*</span>has_ran<span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-keyword z-operator z-arithmetic z-rust">*</span>has_ran <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">ShouldRun<span class="z-punctuation z-accessor z-rust">::</span></span>Yes + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> <span class="z-keyword z-control z-rust">else</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">ShouldRun<span class="z-punctuation z-accessor z-rust">::</span></span>No + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SystemStage<span class="z-punctuation z-accessor z-rust">::</span></span>parallel<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system_run_criteria</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>every_other_time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>every_other_time<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_run_criteria</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>every_other_time<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Results from Run Criteria can also be &quot;piped&quot; into other criteria, which enables interesting composed behaviors:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">once_in_a_blue_moon</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span>In<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-variable z-parameter z-rust">input</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span>: <span class="z-meta z-generic z-rust">In<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ShouldRun<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">moon</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Moon<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> ShouldRun</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> moon<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">is_blue</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + input + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> <span class="z-keyword z-control z-rust">else</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">ShouldRun<span class="z-punctuation z-accessor z-rust">::</span></span>No + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_run_criteria</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>every_other_time<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">pipe</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>once_in_a_blue_moon<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></span></code></pre> +<h3 id="ambiguity-detection-and-resolution">Ambiguity Detection and Resolution +<a class="anchor-link" href="#ambiguity-detection-and-resolution">#</a> +</h3> +<p>While the new executor is now much easier to reason about, it does introduce a new class of error: &quot;system order ambiguities&quot;. When two systems interact with the same data, but have no explicit ordering defined, the output they produce is non-deterministic (and often not what the author intended).</p> +<p>Consider the following app:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">increment_counter</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">counter</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">usize</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-operator z-arithmetic z-rust">*</span>counter <span class="z-keyword z-operator z-assignment z-rust">+=</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">print_every_other_time</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">counter</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">usize</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-keyword z-operator z-arithmetic z-rust">*</span>counter <span class="z-keyword z-operator z-arithmetic z-rust">%</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span> <span class="z-keyword z-operator z-comparison z-rust">==</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">0</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>ran<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>increment_counter<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>print_every_other_time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>The author clearly intended <code>print_every_other_time</code> to run every other update. However, due to the fact that these systems have no order defined, they could run in a different order each update and create a situation where nothing is printed over the course of two updates:</p> +<pre data-lang="txt" class="language-txt z-code"><code class="language-txt" data-lang="txt"><span class="z-text z-plain">UPDATE +- increment_counter (counter now equals 1) +- print_every_other_time (nothing printed) +UPDATE +- print_every_other_time (nothing printed) +- increment_counter (counter now equals 2) +</span></code></pre> +<p>The old executor would have implicitly forced <code>increment_counter</code> to run first because it conflicts with <code>print_every_other_time</code> and it was inserted first. But the new executor requires you to be explicit here (which we believe is a good thing).</p> +<p>To help detect this class of error, we built an opt-in tool that detects these ambiguities and logs them:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> add this resource to your App to enable ambiguity detection +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>ReportExecutionOrderAmbiguities</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Then when we run our App, we will see the following message printed to our terminal:</p> +<pre data-lang="txt" class="language-txt z-code"><code class="language-txt" data-lang="txt"><span class="z-text z-plain">Execution order ambiguities detected, you might want to add an explicit dependency relation between some of these systems: + * Parallel systems: + -- &quot;&amp;app::increment_counter&quot; and &quot;&amp;app::print_every_other_time&quot; + conflicts: [&quot;usize&quot;] +</span></code></pre> +<p>The ambiguity detector found a conflict and mentions that adding an explicit dependency would resolve the conflict:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>increment_counter<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">label</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>increment<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>print_every_other_time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>increment<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>There <em>are</em> some cases where ambiguities are <em>not</em> a bug, such as operations on unordered collection like <code>Assets</code>. This is why we don't enable the detector by default. You are free to just ignore these ambiguities, but if you want to suppress the messages in the detector (without defining a dependency), you can add your systems to an &quot;ambiguity set&quot;:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_ambiguity_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>foo<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">in_ambiguity_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>foo<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>I want to stress that this is totally optional. Bevy code should be ergonomic and &quot;fun&quot; to write. If sprinkling ambiguity sets everywhere isn't your cup of tea, just don't worry about it!</p> +<p>We are also actively seeking feedback on the new executor. We believe that the new implementation is easier to understand and encourages self-documenting code. The improved parallelism is also nice! But we want to hear from users (both new users starting fresh and old users porting their codebases to the new executor). This space is all about design tradeoffs and feedback will help us ensure we made the right calls.</p> +<h2 id="reliable-change-detection">Reliable change detection +<a class="anchor-link" href="#reliable-change-detection">#</a> +</h2> +<div class="release-feature-authors">authors: @Davier, @bjorn3, @alice-i-cecile, @cart</div> +<p>Global change detection, the ability to run queries on the Changed/Added status of any ECS component or resource, just got a major usability boost: changes are now detected across frames/updates:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This is still the same change detection API we all know and love, +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> the only difference is that it &quot;just works&quot; in every situation. +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Entity, <span class="z-meta z-generic z-rust">Changed<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>A<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> iterates all entities whose A component has changed since +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> the last run of this system +</span> <span class="z-keyword z-control z-rust">for</span> e <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Global change detection was already a feature that set Bevy apart from other ECS frameworks, but now it is completely &quot;fool proof&quot;. It works as expected regardless of system ordering, stage membership, or system run criteria.</p> +<p>The old behavior was &quot;systems detect changes that ocurred in systems that ran before them this frame&quot;. This was because we used a <code>bool</code> to track when each component/resource is added/modified. This flag was cleared for each component at the end of the frame. As a result, users had to be very careful about order of operations, and using features like &quot;system run criteria&quot; could result in dropped changes if systems didn't run on a given update.</p> +<p>We now use a clever &quot;world tick&quot; design that allows systems to detect changes that happened at <em>any</em> point in time since their last run.</p> +<h2 id="states-v2">States V2 +<a class="anchor-link" href="#states-v2">#</a> +</h2> +<div class="release-feature-authors">authors: @TheRawMeatball</div> +<p>The <a href="https://bevyengine.org/news/bevy-0-4">last Bevy release</a> added States, which enabled developers to run groups of ECS systems according to the value of a <code>State&lt;T&gt;</code> resource. Systems could be run according to &quot;state lifecycle events&quot;, such as on_enter, on_update, and on_exit. States make things like separate &quot;loading screen&quot; and &quot;in game&quot; logic easier to encode in Bevy ECS.</p> +<p>The old implementation largely worked, but it had a number of quirks and limitations. First and foremost, it required adding a new <code>StateStage</code>, which cut down on parallelism, increased boilerplate, and forced ordering where it wasn't required. Additionally, some of the lifecycle events didn't always behave as expected.</p> +<p>The new + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;schedule/struct.State.html"><code>State</code></a> implementation is built on top of the new parallel executor's SystemSet and RunCriteria features, for a much more natural, flexible, and parallel API that builds on existing concepts instead of creating new ones:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Debug<span class="z-punctuation z-separator z-rust">,</span> Clone<span class="z-punctuation z-separator z-rust">,</span> Eq<span class="z-punctuation z-separator z-rust">,</span> PartialEq<span class="z-punctuation z-separator z-rust">,</span> Hash</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">AppState</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + Menu<span class="z-punctuation z-separator z-rust">,</span> + InGame<span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_state</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SystemSet<span class="z-punctuation z-accessor z-rust">::</span></span>on_enter<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>setup_menu<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SystemSet<span class="z-punctuation z-accessor z-rust">::</span></span>on_update<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>menu_logic<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SystemSet<span class="z-punctuation z-accessor z-rust">::</span></span>on_exit<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>cleanup_menu<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SystemSet<span class="z-punctuation z-accessor z-rust">::</span></span>on_enter<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>InGame</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>setup_game<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system_set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-path z-rust">SystemSet<span class="z-punctuation z-accessor z-rust">::</span></span>on_update<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>InGame</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>game_logic<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>more_game_logic<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>States now use a &quot;stack-based state machine&quot; model. This opens up a number of options for state transitions:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">state</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">State<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AppState<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Queues up a state change that pushes a new state on to the +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> stack (preserving previous states) +</span> state<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">push</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>InGame</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Queues up a state change that removes the current state on +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> the stack and reverts to the previous state +</span> state<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">pop</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Queues up a state change that overwrites the current state at +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> the &quot;top&quot; of the stack +</span> state<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>InGame</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Queues up a state change that replaces the entire stack of states +</span> state<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">replace</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>InGame</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Just like the old implementation, state changes are applied in the same frame. This means it is possible to transition from states <code>A-&gt;B-&gt;C</code> and run the relevant state lifecycle events without skipping frames. This builds on top of &quot;looping run criteria&quot;, which we also use for our &quot;fixed timestep&quot; implementation (and which you can use for your own run criteria logic).</p> +<h2 id="event-ergonomics">Event Ergonomics +<a class="anchor-link" href="#event-ergonomics">#</a> +</h2> +<div class="release-feature-authors">authors: @TheRawMeatball</div> +<p>Events now have a first-class shorthand syntax for easier consumption:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Old Bevy 0.4 syntax +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">reader</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Local<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">EventReader<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">events</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Events<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> event <span class="z-keyword z-operator z-rust">in</span> reader<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>events</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> New Bevy 0.5 syntax +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">reader</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">EventReader<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> event <span class="z-keyword z-operator z-rust">in</span> reader<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>There is also now a symmetrical <code>EventWriter</code> API:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">writer</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">EventWriter<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + writer<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">send</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SomeEvent <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> <span class="z-keyword z-operator z-range z-rust">...</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>The old &quot;manual&quot; approach is still possible via <code>ManualEventReader</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">reader</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Local<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">ManualEventReader<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">events</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Events<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SomeEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> event <span class="z-keyword z-operator z-rust">in</span> reader<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>events</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="rich-text">Rich Text +<a class="anchor-link" href="#rich-text">#</a> +</h2> +<div class="release-feature-authors">authors: @tigregalis</div> +<p>Text can now have &quot;sections&quot;, each with their own style / formatting. This makes text much more flexible, while still respecting the text layout rules:</p> +<p><img src="https://bevyengine.org/news/bevy-0-5/rich_text.png" alt="rich_text" /></p> +<p>This is accomplished using the new &quot;text section&quot; API:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>TextBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + text<span class="z-punctuation z-separator z-rust">:</span> Text <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + sections<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span> + TextSection <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>FPS: <span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + style<span class="z-punctuation z-separator z-rust">:</span> TextStyle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + font<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>FiraSans-Bold.ttf<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + font_size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">90.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + color<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">WHITE</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + TextSection <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>60.03<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + style<span class="z-punctuation z-separator z-rust">:</span> TextStyle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + font<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>FiraMono-Medium.ttf<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + font_size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">90.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + color<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">GOLD</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h2 id="hidpi-text">HIDPI Text +<a class="anchor-link" href="#hidpi-text">#</a> +</h2> +<div class="release-feature-authors">authors: @blunted2night</div> +<p>Text is now rendered according to the current monitor's scale factor. This gives nice, crisp text at any resolution.</p> +<p><img src="https://bevyengine.org/news/bevy-0-5/hidpi_text.png" alt="hidpi_text" /></p> +<h2 id="render-text-in-2d-world-space">Render Text in 2D World Space +<a class="anchor-link" href="#render-text-in-2d-world-space">#</a> +</h2> +<div class="release-feature-authors">authors: @CleanCut, @blunted2night</div> +<p>Text can now be spawned into 2D scenes using the new <code>Text2dBundle</code>. This makes it easier to do things like &quot;draw names above players&quot;.</p> +<p><video controls loop><source src="2d_text.mp4" type="video/mp4"/></video></p> +<h2 id="world-to-screen-coordinate-conversions">World To Screen Coordinate Conversions +<a class="anchor-link" href="#world-to-screen-coordinate-conversions">#</a> +</h2> +<div class="release-feature-authors">authors: @aevyrie</div> +<p>It is now possible to convert world coordinates to a given camera's screen coordinates using the new <code>Camera::world_to_screen()</code> function. Here is an example of this feature being used to position a UI element on top of a moving 3d object.</p> +<p><video controls loop><source src="world_to_screen.mp4" type="video/mp4"/></video></p> +<h2 id="3d-orthographic-camera">3D Orthographic Camera +<a class="anchor-link" href="#3d-orthographic-camera">#</a> +</h2> +<div class="release-feature-authors">authors: @jamadazi</div> +<p>Orthographic cameras can now be used in 3D! This is useful for things like CAD applications and isometric games.</p> +<p><img src="https://bevyengine.org/news/bevy-0-5/ortho_3d.png" alt="ortho_3d" /></p> +<h2 id="orthographic-camera-scaling-modes">Orthographic Camera Scaling Modes +<a class="anchor-link" href="#orthographic-camera-scaling-modes">#</a> +</h2> +<div class="release-feature-authors">authors: @jamadazi</div> +<p>Prior to <strong>Bevy 0.5</strong>, Bevy's orthographic camera had only one mode: &quot;window scaling&quot;. It would adapt the projection according to the vertical and horizontal size of the window. This works for some styles of games, but other games need arbitrary window-independent scale factors or scale factors defined by either horizontal or vertical window sizes.</p> +<p><strong>Bevy 0.5</strong> adds a new <code>ScalingMode</code> option to <code>OrthographicCamera</code>, which enables developers to customize how the projection is calculated.</p> +<p>It also adds the ability to &quot;zoom&quot; the camera using <code>OrthographicProjection::scale</code>.</p> +<h2 id="flexible-camera-bindings">Flexible Camera Bindings +<a class="anchor-link" href="#flexible-camera-bindings">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>Bevy used to &quot;hack in&quot; camera bindings for each RenderGraph PassNode. This worked when there was only one binding type (the combined <code>ViewProj</code> matrix), but many shaders require other camera properties, such as the world space position.</p> +<p>In Bevy 0.5 we removed the &quot;hack&quot; in favor of the <code>RenderResourceBindings</code> system used elsewhere. This enables shaders to bind arbitrary camera data (with any set or binding index) and only pull in the data they need.</p> +<p>The new PBR shaders take advantage of this feature, but custom shaders can also use it.</p> +<pre data-lang="glsl" class="language-glsl z-code"><code class="language-glsl" data-lang="glsl"><span class="z-source z-glsl"><span class="z-storage z-modifier z-glsl">layout</span><span class="z-meta z-group z-glsl"><span class="z-punctuation z-section z-group z-begin z-glsl">(</span>set <span class="z-keyword z-operator z-assignment z-glsl">=</span> <span class="z-constant z-numeric z-glsl">0</span><span class="z-punctuation z-separator z-glsl">,</span> binding <span class="z-keyword z-operator z-assignment z-glsl">=</span> <span class="z-constant z-numeric z-glsl">0</span><span class="z-punctuation z-section z-group z-end z-glsl">)</span></span> <span class="z-storage z-modifier z-glsl">uniform</span> CameraViewProj <span class="z-meta z-block z-glsl"><span class="z-punctuation z-section z-block z-begin z-glsl">{</span> + <span class="z-storage z-type z-glsl">mat4</span> ViewProj<span class="z-punctuation z-terminator z-glsl">;</span> +<span class="z-punctuation z-section z-block z-end z-glsl">}</span></span><span class="z-punctuation z-terminator z-glsl">;</span> +<span class="z-storage z-modifier z-glsl">layout</span><span class="z-meta z-group z-glsl"><span class="z-punctuation z-section z-group z-begin z-glsl">(</span>set <span class="z-keyword z-operator z-assignment z-glsl">=</span> <span class="z-constant z-numeric z-glsl">0</span><span class="z-punctuation z-separator z-glsl">,</span> binding <span class="z-keyword z-operator z-assignment z-glsl">=</span> <span class="z-constant z-numeric z-glsl">1</span><span class="z-punctuation z-section z-group z-end z-glsl">)</span></span> <span class="z-storage z-modifier z-glsl">uniform</span> CameraPosition <span class="z-meta z-block z-glsl"><span class="z-punctuation z-section z-block z-begin z-glsl">{</span> + <span class="z-storage z-type z-glsl">vec3</span> CameraPos<span class="z-punctuation z-terminator z-glsl">;</span> +<span class="z-punctuation z-section z-block z-end z-glsl">}</span></span><span class="z-punctuation z-terminator z-glsl">;</span> +</span></code></pre> +<h2 id="render-layers">Render Layers +<a class="anchor-link" href="#render-layers">#</a> +</h2> +<div class="release-feature-authors">authors: @schell</div> +<p>Sometimes you don't want a camera to draw everything in a scene, or you want to temporarily hide a set of things in the scene. <strong>Bevy 0.5</strong> adds a <code>RenderLayer</code> system, which gives developers the ability to add entities to layers by adding the <code>RenderLayers</code> component.</p> +<p>Cameras can also have a + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_render&#x2F;0.5.0&#x2F;bevy_render&#x2F;camera/struct.RenderLayers.html"><code>RenderLayers</code></a> component, which determines what layers they can see.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> spawn a sprite on layer 0 +</span>commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + transform<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Transform<span class="z-punctuation z-accessor z-rust">::</span></span>from_xyz<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-keyword z-operator z-arithmetic z-rust">-</span><span class="z-constant z-numeric z-float z-rust">50.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + sprite<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Sprite<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Vec2<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">30.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">30.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">RenderLayers<span class="z-punctuation z-accessor z-rust">::</span></span>layer<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> spawn a sprite on layer 1 +</span>commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + transform<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Transform<span class="z-punctuation z-accessor z-rust">::</span></span>from_xyz<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-keyword z-operator z-arithmetic z-rust">-</span><span class="z-constant z-numeric z-float z-rust">50.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + sprite<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Sprite<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Vec2<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">30.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">30.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">RenderLayers<span class="z-punctuation z-accessor z-rust">::</span></span>layer<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> spawn a camera that only draws the sprite on layer 1 +</span>commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">OrthographicCameraBundle<span class="z-punctuation z-accessor z-rust">::</span></span>new_2d<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">RenderLayers<span class="z-punctuation z-accessor z-rust">::</span></span>layer<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="sprite-flipping">Sprite Flipping +<a class="anchor-link" href="#sprite-flipping">#</a> +</h2> +<div class="release-feature-authors">authors: @zicklag</div> +<p>Sprites can now be easily (and efficiently) flipped along the x or y axis:</p> +<p><img src="https://bevyengine.org/news/bevy-0-5/sprite_flipping.png" alt="sprite_flipping" /></p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + material<span class="z-punctuation z-separator z-rust">:</span> material<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + transform<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Transform<span class="z-punctuation z-accessor z-rust">::</span></span>from_xyz<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">150.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteBundle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + material<span class="z-punctuation z-separator z-rust">,</span> + transform<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Transform<span class="z-punctuation z-accessor z-rust">::</span></span>from_xyz<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-arithmetic z-rust">-</span><span class="z-constant z-numeric z-float z-rust">150.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + sprite<span class="z-punctuation z-separator z-rust">:</span> Sprite <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Flip the logo to the left +</span> flip_x<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-language z-rust">true</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> And don&#39;t flip it upside-down ( the default ) +</span> flip_y<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-language z-rust">false</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="color-spaces">Color Spaces +<a class="anchor-link" href="#color-spaces">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p> + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_render&#x2F;0.5.0&#x2F;bevy_render&#x2F;color/enum.Color.html"><code>Color</code></a> is now internally represented as an enum, which enables lossless (and correct) color representation. This is a significant improvement over the previous implementation, which internally converted all colors to linear sRGB (which could cause precision issues). Colors are now only converted to linear sRGB when they are sent to the GPU. We also took this opportunity to fix some incorrect color constants defined in the wrong color space.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-enum z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">Color</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> sRGBA color +</span> Rgba <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Red component. [0.0, 1.0] +</span> red<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Green component. [0.0, 1.0] +</span> green<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Blue component. [0.0, 1.0] +</span> blue<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Alpha component. [0.0, 1.0] +</span> alpha<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> RGBA color in the Linear sRGB colorspace (often colloquially referred to as &quot;linear&quot;, &quot;RGB&quot;, or &quot;linear RGB&quot;). +</span> RgbaLinear <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Red component. [0.0, 1.0] +</span> red<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Green component. [0.0, 1.0] +</span> green<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Blue component. [0.0, 1.0] +</span> blue<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Alpha component. [0.0, 1.0] +</span> alpha<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> HSL (hue, saturation, lightness) color with an alpha channel +</span> Hsla <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Hue component. [0.0, 360.0] +</span> hue<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Saturation component. [0.0, 1.0] +</span> saturation<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Lightness component. [0.0, 1.0] +</span> lightness<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> Alpha component. [0.0, 1.0] +</span> alpha<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="wireframes">Wireframes +<a class="anchor-link" href="#wireframes">#</a> +</h2> +<div class="release-feature-authors">authors: @Neo-Zhixing</div> +<p>Bevy can now draw wireframes using the opt-in <code>WireframePlugin</code></p> +<p><img src="https://bevyengine.org/news/bevy-0-5/wireframe.png" alt="wireframe" /></p> +<p>These can either be enabled globally or per-entity by adding the new <code>Wireframe</code> component.</p> +<h2 id="simple-3d-game-example-alien-cake-addict">Simple 3D Game Example: Alien Cake Addict +<a class="anchor-link" href="#simple-3d-game-example-alien-cake-addict">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>This example serves as a quick introduction to building 3D games in Bevy. It shows how to spawn scenes, respond to input, implement game logic, and handle state transitions. Pick up as many cakes as you can!</p> +<p><img src="https://bevyengine.org/news/bevy-0-5/alien_cake_addict.png" alt="alien_cake_addict" /></p> +<h2 id="timer-improvements">Timer Improvements +<a class="anchor-link" href="#timer-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @kokounet</div> +<p>The + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_core&#x2F;0.5.0&#x2F;bevy_core/struct.Timer.html"><code>Timer</code></a> struct now internally uses + + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;doc.rust-lang.org/stable&#x2F;std&#x2F;time/struct.Duration.html"><code>Duration</code></a>s instead of using <code>f32</code> representations of seconds. This both increases precision and makes the API a bit nicer to look at.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">timer</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Timer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> timer<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">tick</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">delta</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">just_finished</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>timer just finished<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="assets-improvements">Assets Improvements +<a class="anchor-link" href="#assets-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @willcrichton, @zicklag, @mockersf, @Archina</div> +<p>Bevy's asset system had a few minor improvements this release:</p> +<ul> +<li>Bevy no longer panics on errors when loading assets</li> +<li>Asset paths with multiple dots are now properly handled</li> +<li>Improved type safety for &quot;labeled assets&quot; produced by asset loaders</li> +<li>Made asset path loading case-insensitive</li> +</ul> +<h2 id="wgpu-configuration-options">WGPU Configuration Options +<a class="anchor-link" href="#wgpu-configuration-options">#</a> +</h2> +<div class="release-feature-authors">authors: @Neo-Zhixing</div> +<p>It is now possible to enable/disable wgpu features (such as <code>WgpuFeature::PushConstants</code> and <code>WgpuFeature::NonFillPolygonMode</code>) by setting them in the <code>WgpuOptions</code> resource:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>WgpuOptions <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + features<span class="z-punctuation z-separator z-rust">:</span> WgpuFeatures <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + features<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-meta z-path z-rust">WgpuFeature<span class="z-punctuation z-accessor z-rust">::</span></span>NonFillPolygonMode<span class="z-punctuation z-section z-group z-end z-rust">]</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + +</span></code></pre> +<p>Wgpu limits (such as <code>WgpuLimits::max_bind_groups</code>) can also now be configured in the <code>WgpuOptions</code> resource.</p> +<h2 id="scene-instance-entity-iteration">Scene Instance Entity Iteration +<a class="anchor-link" href="#scene-instance-entity-iteration">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>It is now possible to iterate all entities in a spawned scene instance. This makes it possible to perform post-processing on scenes after they have been loaded.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MySceneInstance</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>InstanceId</span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">setup</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, + <span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">scene_spawner</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SceneSpawner<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Spawn a scene and keep its `instance_id` +</span> <span class="z-storage z-type z-rust">let</span> instance_id <span class="z-keyword z-operator z-assignment z-rust">=</span> scene_spawner<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>model.gltf#Scene0<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MySceneInstance<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>instance_id</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">print_scene_entities</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span> + <span class="z-variable z-parameter z-rust">scene_spawner</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SceneSpawner<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-parameter z-rust">scene_instance</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MySceneInstance<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity_iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> scene_spawner<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_instance_entities</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>scene_instance<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> entity <span class="z-keyword z-operator z-rust">in</span> entity_iter <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Found scene entity <span class="z-constant z-other z-placeholder z-rust">{:?}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> entity<span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="window-resize-constraints">Window Resize Constraints +<a class="anchor-link" href="#window-resize-constraints">#</a> +</h2> +<div class="release-feature-authors">authors: @digital7-code</div> +<p>Windows can now have &quot;resize constraints&quot;. Windows cannot be resized past these constraints</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>WindowDescriptor <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + resize_constraints<span class="z-punctuation z-separator z-rust">:</span> WindowResizeConstraints <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + min_height<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">200.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + max_height<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">800.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h2 id="send-tasks">!Send Tasks +<a class="anchor-link" href="#send-tasks">#</a> +</h2> +<div class="release-feature-authors">authors: @alec-deason</div> +<p>Bevy's async task system now supports <code>!Send</code> tasks. Some tasks cannot be sent / run on other threads (such as tasks created by the upcoming Distill asset plugin). &quot;Thread local&quot; tasks can now be spawned in Bevy <code>TaskPools</code> like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> pool <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">TaskPool<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +pool<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">scope</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">scope</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + scope<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_local</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>async <span class="z-storage z-modifier z-rust">move</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>I am a local task<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="more-ecs-v2-changes">More ECS V2 Changes +<a class="anchor-link" href="#more-ecs-v2-changes">#</a> +</h2> +<h3 id="entityref-entitymut">EntityRef / EntityMut +<a class="anchor-link" href="#entityref-entitymut">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>World entity operations in <strong>Bevy 0.4</strong> require that the user passes in an <code>entity</code> id to each operation:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> entity <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>A<span class="z-punctuation z-separator z-rust">,</span> </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> create a new entity with A +</span>world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>A<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>B<span class="z-punctuation z-separator z-rust">,</span> C</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_one</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity<span class="z-punctuation z-separator z-rust">,</span> D</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This means that each operation needs to look up the entity location / verify its validity. The initial spawn operation also requires a Bundle as input. This can be awkward when no components are required (or one component is required).</p> +<p>These operations have been replaced by <code>EntityRef</code> and <code>EntityMut</code>, which are &quot;builder-style&quot; wrappers around world that provide read and read/write operations on a single, pre-validated entity:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> spawn now takes no inputs and returns an EntityMut +</span><span class="z-storage z-type z-rust">let</span> entity <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>A</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> insert a single component into the entity +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>B<span class="z-punctuation z-separator z-rust">,</span> C</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> insert a bundle of components into the entity +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">id</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> id returns the Entity id +</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Returns EntityMut (or panics if the entity does not exist) +</span>world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>D</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SomeBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The `get_X` variants return Options, in case you want to check existence instead of panicking +</span>world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_entity_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>E</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity_ref</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> d <span class="z-keyword z-operator z-assignment z-rust">=</span> entity_ref<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>D<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p><code>Commands</code> have also been updated to use this new pattern</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> entity <span class="z-keyword z-operator z-assignment z-rust">=</span> commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>A</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>B<span class="z-punctuation z-separator z-rust">,</span> C</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SomeBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">id</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p><code>Commands</code> also still support spawning with a Bundle, which should make migration from <strong>Bevy 0.4</strong> easier. It also cuts down on boilerplate in some situations:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SomeBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Note that these Command methods use the &quot;type state&quot; pattern, which means this style of chaining is no longer possible:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Spawns two entities, each with the components in SomeBundle and the A component +</span><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Valid in Bevy 0.4, but invalid in Bevy 0.5 +</span>commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SomeBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>A</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SomeBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>A</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Instead, you should do this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SomeBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>A</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_bundle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">SomeBundle<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>A</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This allows us to make things like &quot;entity id retrieval&quot; infallible and opens the doors to future API improvements.</p> +<h3 id="query-single">Query::single +<a class="anchor-link" href="#query-single">#</a> +</h3> +<div class="release-feature-authors">authors: @TheRawMeatball</div> +<p>Queries now have + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;system/struct.Query.html#method.single"><code>Query::single()</code></a> and + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.5.0&#x2F;bevy_ecs&#x2F;system/struct.Query.html#method.single_mut"><code>Query::single_mut()</code></a> methods, which return a single query result if there is <em>exactly</em> one matching entity:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> only returns Ok if there is exactly one Player +</span> <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Ok</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>player</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">single</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="removed-changedres">Removed ChangedRes +<a class="anchor-link" href="#removed-changedres">#</a> +</h3> +<div class="release-feature-authors">authors: @TheRawMeatball</div> +<p>We have removed <code>ChangedRes&lt;A&gt;</code> in favor of the following:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">a</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>A<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> a<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">is_changed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="optional-resource-queries">Optional Resource Queries +<a class="anchor-link" href="#optional-resource-queries">#</a> +</h3> +<div class="release-feature-authors">authors: @jamadazi</div> +<p>It is now possible for a system to check for Resource existence via <code>Option</code> queries:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">a</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Option</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>A<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> a <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="new-bundle-naming-convention">New Bundle Naming Convention +<a class="anchor-link" href="#new-bundle-naming-convention">#</a> +</h3> +<p>Component Bundles previously used the <code>XComponents</code> naming convention (ex: <code>SpriteComponents</code>, <code>TextComponents</code>, etc). We decided to move to a <code>XBundle</code> naming convention (ex: <code>SpriteBundle</code>, <code>TextBundle</code>, etc) to be more explicit about what these types are and to help prevent new users from conflating Bundles and Components.</p> +<h3 id="world-metadata-improvements">World Metadata Improvements +<a class="anchor-link" href="#world-metadata-improvements">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p><code>World</code> now has queryable <code>Components</code>, <code>Archetypes</code>, <code>Bundles</code>, and <code>Entities</code> collections:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> you can access these new collections from normal systems, just like any other SystemParam +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">archetypes</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Archetypes, <span class="z-variable z-parameter z-rust">components</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Components, <span class="z-variable z-parameter z-rust">bundles</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Bundles, <span class="z-variable z-parameter z-rust">entities</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Entities</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>This enables developers to access internal ECS metadata from their Systems.</p> +<h3 id="configurable-systemparams">Configurable SystemParams +<a class="anchor-link" href="#configurable-systemparams">#</a> +</h3> +<div class="release-feature-authors">authors: @cart, @DJMcNab</div> +<p>Users can now provide some initial configuration / values for system parameters (when possible). Most SystemParams have no config (the config type is <code>()</code>), but the <code>Local&lt;T&gt;</code> param now supports user-provided parameters:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">foo</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">value</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Local<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">usize</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">config</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">c</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust">c<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">10</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="preparation-for-scripting-support">Preparation for Scripting Support +<a class="anchor-link" href="#preparation-for-scripting-support">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>Bevy ECS Components are now decoupled from Rust types. The new <code>Components</code> collection stores metadata such as memory layout and destructors. Components also no longer require Rust TypeIds.</p> +<p>New component metadata can be added at any time using <code>world.register_component()</code>.</p> +<p>All component storage types (currently Table and Sparse Set) are &quot;blob storage&quot;. They can store any value with a given memory layout. This enables data from other sources (ex: a Python data type) to be stored and accessed in the same way as Rust data types.</p> +<p>We haven't completely enabled scripting yet (<a href="https://discord.com/channels/691052431525675048/692648082499829760/817178225791729716">and will likely never officially support non-Rust scripting</a>), but this is a major step toward enabling community-supported scripting languages.</p> +<h3 id="merged-resources-into-world">Merged Resources into World +<a class="anchor-link" href="#merged-resources-into-world">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>Resources are now just a special kind of Component. This allows us to keep the code size small by reusing existing Bevy ECS internals. It also enabled us to optimize the parallel executor access controls and it should make scripting language integration easier down the line.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> a <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_resource<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">i32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> b <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_resource_mut<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f64</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-keyword z-operator z-arithmetic z-rust">*</span>b <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-constant z-numeric z-float z-rust">3.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Resources are still accessed the same way in Systems +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">foo</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f64</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">bar</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">i32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p><em>But</em> this merge did create problems for people directly interacting with <code>World</code>. What if you need mutable access to multiple resources at the same time? <code>world.get_resource_mut()</code> borrows World mutably, which prevents multiple mutable accesses! We solved this with <code>WorldCell</code>.</p> +<h3 id="worldcell">WorldCell +<a class="anchor-link" href="#worldcell">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>WorldCell applies the &quot;access control&quot; concept used by Systems to direct world access:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> world_cell <span class="z-keyword z-operator z-assignment z-rust">=</span> world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">cell</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> a <span class="z-keyword z-operator z-assignment z-rust">=</span> world_cell<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_resource_mut<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">i32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> b <span class="z-keyword z-operator z-assignment z-rust">=</span> world_cell<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_resource_mut<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">f64</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This adds cheap runtime checks to ensure that world accesses do not conflict with each other.</p> +<p>We made this a separate API to enable users to decide what tradeoffs they want. Direct World access has stricter lifetimes, but it is more efficient and does compile time access control. <code>WorldCell</code> has looser lifetimes, but incurs a <em>small</em> runtime penalty as a result.</p> +<p>The API is currently limited to resource access, but it will be extended to queries / entity component access in the future.</p> +<h3 id="resource-scopes">Resource Scopes +<a class="anchor-link" href="#resource-scopes">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>WorldCell does not yet support component queries, and even when it does there will sometimes be legitimate reasons to want a mutable world ref <em>and</em> a mutable resource ref (ex: bevy_render and bevy_scene both need this). In these cases we could always drop down to the unsafe <code>world.get_resource_unchecked_mut()</code>, but that is not ideal!</p> +<p>Instead developers can use a &quot;resource scope&quot;</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">world<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">resource_scope</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World<span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">a</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Mut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>A<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This temporarily removes the <code>A</code> resource from <code>World</code>, provides mutable pointers to both, and re-adds A to World when finished. Thanks to the move to ComponentIds/sparse sets, this is a cheap operation.</p> +<p>If multiple resources are required, scopes can be nested. We could also consider adding a &quot;resource tuple&quot; to the API if this pattern becomes common and the boilerplate gets nasty.</p> +<h3 id="query-conflicts-use-componentid-instead-of-archetypecomponentid">Query Conflicts Use ComponentId Instead of ArchetypeComponentId +<a class="anchor-link" href="#query-conflicts-use-componentid-instead-of-archetypecomponentid">#</a> +</h3> +<div class="release-feature-authors">authors: @cart</div> +<p>For safety reasons, systems cannot contain queries that conflict with each other without wrapping them in a <code>QuerySet</code>. In <strong>Bevy 0.4</strong>, we used <code>ArchetypeComponentIds</code> to determine conflicts. This was nice because it could take into account filters:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> these queries will never conflict due to their filters +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">filter_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">a</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A, <span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>B<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">b</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> B, <span class="z-meta z-generic z-rust">Without<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>B<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>But it also had a significant downside:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> these queries will not conflict _until_ an entity with A, B, and C is spawned +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">maybe_conflicts_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">a</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A, <span class="z-keyword z-operator z-rust">&amp;</span>C<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">b</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A, <span class="z-keyword z-operator z-rust">&amp;</span>B<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>The system above will panic at runtime if an entity with A, B, and C is spawned. This makes it hard to trust that your game logic will run without crashing.</p> +<p>In <strong>Bevy 0.5</strong>, we switched to using <code>ComponentId</code> instead of <code>ArchetypeComponentId</code>. This <em>is</em> more constraining. <code>maybe_conflicts_system</code> will now always fail, but it will do it consistently at startup.</p> +<p>Naively, it would also <em>disallow</em> <code>filter_system</code>, which would be a significant downgrade in usability. Bevy has a number of internal systems that rely on disjoint queries and we expect it to be a common pattern in userspace. To resolve this, we added a new internal <code>FilteredAccess&lt;T&gt;</code> type, which wraps <code>Access&lt;T&gt;</code> and adds with/without filters. If two <code>FilteredAccess</code> have with/without values that prove they are disjoint, they will no longer conflict.</p> +<p>This means <code>filter_system</code> is still perfectly valid in <strong>Bevy 0.5</strong>. We get most of the benefits of the old implementation, but with consistent and predictable rules enforced at app startup.</p> +<h2 id="what-s-next-for-bevy">What's Next For Bevy? +<a class="anchor-link" href="#what-s-next-for-bevy">#</a> +</h2> +<p>We still have a long road ahead of us, but the Bevy developer community is growing at a rapid pace and we already have big plans for the future. Expect to see progress in the following areas soon:</p> +<ul> +<li>&quot;Pipelined&quot; rendering and other renderer optimizations</li> +<li>Bevy UI redesign</li> +<li>Animation: component animation and 3d skeletal animation</li> +<li>ECS: relationships/indexing, async systems, archetype invariants, &quot;stageless&quot; system schedules</li> +<li>3D Lighting Features: shadows, more light types</li> +<li>More Bevy Scene features and usability improvements</li> +</ul> +<p>We also plan on breaking ground on the Bevy Editor as soon as we converge on a final Bevy UI design.</p> +<h2 id="support-bevy">Support Bevy +<a class="anchor-link" href="#support-bevy">#</a> +</h2> +<p><a href="https://github.com/sponsors/cart">Sponsorships</a> help make full time work on Bevy sustainable. If you believe in Bevy's mission, consider <a href="https://github.com/sponsors/cart">sponsoring @cart</a> ... every bit helps!</p> +<p><a class="button button--pink header__cta" href="https://github.com/sponsors/cart">Donate <img class="button__icon" src="/assets/heart.svg" alt="heart icon"/></a></p> +<h2 id="contributors">Contributors +<a class="anchor-link" href="#contributors">#</a> +</h2> +<p>A huge thanks to the <strong>88 contributors</strong> that made this release (and associated docs) possible!</p> +<ul> +<li>mockersf</li> +<li>CAD97</li> +<li>willcrichton</li> +<li>Toniman20</li> +<li>ElArtista</li> +<li>lassade</li> +<li>Divoolej</li> +<li>msklywenn</li> +<li>cart</li> +<li>maxwellodri</li> +<li>schell</li> +<li>payload</li> +<li>guimcaballero</li> +<li>themilkybit</li> +<li>Davier</li> +<li>TheRawMeatball</li> +<li>alexschrod</li> +<li>Ixentus</li> +<li>undinococo</li> +<li>zicklag</li> +<li>lambdagolem</li> +<li>reidbhuntley</li> +<li>enfipy</li> +<li>CleanCut</li> +<li>LukeDowell</li> +<li>IngmarBitter</li> +<li>MinerSebas</li> +<li>ColonisationCaptain</li> +<li>tigregalis</li> +<li>siler</li> +<li>Lythenas</li> +<li>Restioson</li> +<li>kokounet</li> +<li>ryanleecode</li> +<li>adam-bates</li> +<li>Neo-Zhixing</li> +<li>bgourlie</li> +<li>Telzhaak</li> +<li>rkr35</li> +<li>jamadazi</li> +<li>bjorn3</li> +<li>VasanthakumarV</li> +<li>turboMaCk</li> +<li>YohDeadfall</li> +<li>rmsc</li> +<li>szunami</li> +<li>mnmaita</li> +<li>WilliamTCarroll</li> +<li>Ratysz</li> +<li>OptimisticPeach</li> +<li>mtsr</li> +<li>AngelicosPhosphoros</li> +<li>Adamaq01</li> +<li>Moxinilian</li> +<li>tomekr</li> +<li>jakobhellermann</li> +<li>sdfgeoff</li> +<li>Byteron</li> +<li>aevyrie</li> +<li>verzuz</li> +<li>ndarilek</li> +<li>huhlig</li> +<li>zaszi</li> +<li>Puciek</li> +<li>DJMcNab</li> +<li>sburris0</li> +<li>rparrett</li> +<li>smokku</li> +<li>TehPers</li> +<li>alec-deason</li> +<li>Fishrock123</li> +<li>woubuc</li> +<li>Newbytee</li> +<li>Archina</li> +<li>StarArawn</li> +<li>JCapucho</li> +<li>M2WZ</li> +<li>TotalKrill</li> +<li>refnil</li> +<li>bitshifter</li> +<li>NiklasEi</li> +<li>alice-i-cecile</li> +<li>joshuajbouw</li> +<li>DivineGod</li> +<li>ShadowMitia</li> +<li>memoryruins</li> +<li>blunted2night</li> +<li>RedlineTriad</li> +</ul> +<h2 id="change-log">Change Log +<a class="anchor-link" href="#change-log">#</a> +</h2> +<h3 id="added">Added +<a class="anchor-link" href="#added">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/1554">PBR Rendering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1632">PBR Textures</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1132">HIDPI Text</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1245">Rich text</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/562">Wireframe Rendering Pipeline</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1209">Render Layers</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1407">Add Sprite Flipping</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/400">OrthographicProjection scaling mode + camera bundle refactoring</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1361">3D OrthographicProjection improvements + new example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1689">Flexible camera bindings</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1122">Render text in 2D scenes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1171">Text2d render quality</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1675">System sets and run criteria v2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1144">System sets and parallel executor v2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1576">Many-to-many system labels</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1473">Non-string labels (#1423 continued)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1244">Make EventReader a SystemParam</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1575">Add EventWriter</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1471">Reliable change detection</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1424">Redo State architecture</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1263">Query::get_unique</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1762">gltf: load normal and occlusion as linear textures</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1605">Add separate brightness field to AmbientLight</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1258">world coords to screen space</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1492">Experimental Frustum Culling (for Sprites)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1544">Enable wgpu device limits</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1223">bevy_render: add torus and capsule shape</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1194">New mesh attribute: color</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1262">Minimal change to support instanced rendering</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1274">Add support for reading from mapped buffers</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1365">Texture atlas format and conversion</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/547">enable wgpu device features</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1196">Subpixel text positioning</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1020">make more information available from loaded GLTF model</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1183">use Name on node when loading a gltf file</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1639">GLTF loader: support mipmap filters</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1341">Add support for gltf::Material::unlit</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1218">Implement Reflect for tuples up to length 12</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1277">Process Asset File Extensions With Multiple Dots</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1339">Update Scene Example to Use scn.ron File</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1252">3d game example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1657">Add keyboard modifier example (#1656)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1112">Count number of times a repeating Timer wraps around in a tick</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1151">recycle <code>Timer</code> refactor to duration.sparkles Add <code>Stopwatch</code> struct.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1058">add scene instance entity iteration</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1703">Make Commands and World apis consistent</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1728">Add <code>insert_children</code> and <code>push_children</code> to EntityMut</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1453">Extend AppBuilder API with <code>add_system_set</code> and similar methods</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1456">add labels and ordering for transform and parent systems in POST_UPDATE stage</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1469">Explicit execution order ambiguities API</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1606">Resolve (most) internal system ambiguities</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1257">Change 'components' to 'bundles' where it makes sense semantically</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1172">add <code>Flags&lt;T&gt;</code> as a query to get flags of component</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1356">Rename add_resource to insert_resource</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1349">Update init_resource to not overwrite</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1284">Enable dynamic mutable access to component data</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1313">Get rid of ChangedRes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1494">impl SystemParam for Option&lt;Res<T>&gt; / Option&lt;ResMut<T>&gt;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1409">Add Window Resize Constraints</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1096">Add basic file drag and drop support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1089">Modify Derive to allow unit structs for RenderResources.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1104">bevy_render: load .spv assets</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1042">Expose wgpu backend in WgpuOptions and allow it to be configured from the environment</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1085">updates on diagnostics (log + new diagnostics)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1155">enable change detection for labels</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1109">Name component with fast comparisons</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1216">Support for !Send tasks</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1266">Add missing spawn_local method to Scope in the single threaded executor case</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1081">Add bmp as a supported texture format</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1063">Add an alternative winit runner that can be started when not on the main thread</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1131">Added use_dpi setting to WindowDescriptor</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1154">Implement Copy for ElementState</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1164">Mutable mesh accessors: indices_mut and attribute_mut</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1200">Add support for OTF fonts</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1212">Add <code>from_xyz</code> to <code>Transform</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1236">Adding copy_texture_to_buffer and copy_texture_to_texture</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1292">Added <code>set_minimized</code> and <code>set_position</code> to <code>Window</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1503">Example for 2D Frustum Culling</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1478">Add remove resource to commands</a></li> +</ul> +<h3 id="changed">Changed +<a class="anchor-link" href="#changed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/1525">Bevy ECS V2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1366">Fix Reflect serialization of tuple structs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1572">color spaces and representation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1485">Make vertex buffers optional</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1427">add to lower case to make asset loading case insensitive</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1476">Replace right/up/forward and counter parts with local_x/local_y and local_z</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1268">Use valid keys to initialize AHasher in FixedState</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1283">Change Name to take Into<String> instead of String</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/542">Update to wgpu-rs 0.7</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1550">Update glam to 0.13.0.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1644">use std clamp instead of Bevy's</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1679">Make Reflect impls unsafe (Reflect::any must return <code>self</code>)</a></li> +</ul> +<h3 id="fixed">Fixed +<a class="anchor-link" href="#fixed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/1524">convert grayscale images to rgb</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1454">Glb textures should use bevy_render to load images</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1286">Don't panic on error when loading assets</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1299">Prevent ImageBundles from causing constant layout recalculations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1070">do not check for focus until cursor position has been set</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1121">Fix lock order to remove the chance of deadlock</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1064">Prevent double panic in the Drop of TaksPoolInner</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1072">Ignore events when receiving unknown WindowId</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1055">Fix potential bug when using multiple lights.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1180">remove panics when mixing UI and non UI entities in hierarchy</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1204">fix label to load gltf scene</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1221">fix repeated gamepad events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1224">Fix iOS touch location</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1229">Don't panic if there's no index buffer and call draw</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1340">Fix Bug in Asset Server Error Message Formatter</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1346">add_stage now checks Stage existence</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1357">Fix Un-Renamed add_resource Compile Error</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1315">Fix Interaction not resetting to None sometimes</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1399">Fix regression causing &quot;flipped&quot; sprites to be invisible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1416">revert default vsync mode to Fifo</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1434">Fix missing paths in ECS SystemParam derive macro</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1509">Fix staging buffer required size calculation (fixes #1056)</a></li> +</ul> + + + + Bevy 0.4 + 2020-12-19T00:00:00+00:00 + 2020-12-19T00:00:00+00:00 + + https://bevyengine.org/news/bevy-0-4/ + <p>A little over a month after releasing Bevy 0.3, and thanks to <strong>66</strong> contributors, <strong>178</strong> pull requests, and our <a href="https://github.com/sponsors/cart"><strong>generous sponsors</strong></a>, I'm happy to announce the <strong>Bevy 0.4</strong> release on <a href="https://crates.io/crates/bevy">crates.io</a>!</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out <a href="/learn/book/getting-started/">Quick Start Guide</a> to get started. Bevy is also free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub.</p> +<p>Here are some of the highlights from this release:</p> +<span id="continue-reading"></span><h2 id="wasm-webgl2">WASM + WebGL2 +<a class="anchor-link" href="#wasm-webgl2">#</a> +</h2> +<div class="release-feature-authors">authors: @mrk-its</div> +<p>Bevy now has a WebGL2 render backend! @mrk-its has been hard at work building the <a href="https://github.com/mrk-its/bevy_webgl2">Bevy WebGL2 Plugin</a> and expanding <code>bevy_render</code> to meet the needs of the web. He also put together a nice website showcasing various Bevy examples and games running on the web.</p> +<p>I think the results speak for themselves:</p> +<h3 id="bevy-webgl2-showcase"><a href="https://mrk.sed.pl/bevy-showcase/">Bevy WebGL2 Showcase</a> +<a class="anchor-link" href="#bevy-webgl2-showcase">#</a> +</h3> +<p><a href="https://mrk.sed.pl/bevy-showcase/"><img src="https://bevyengine.org/news/bevy-0-4/webgl_showcase.png" alt="webgl2 showcase" /></a></p> +<h2 id="cross-platform-main-function">Cross Platform Main Function +<a class="anchor-link" href="#cross-platform-main-function">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>On most supported Bevy platforms you can just use normal main functions (ex: Windows, MacOS, Linux, and Web). Here is the smallest possible Bevy app that runs on those platforms:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-other z-rust">use</span> <span class="z-meta z-path z-rust">bevy<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">prelude<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-keyword z-operator z-arithmetic z-rust">*</span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>However some platforms (currently Android and iOS) require additional boilerplate. This arcane magic is error prone, takes up space, and isn't particularly nice to look at. Up until this point, Bevy users had to supply their own boilerplate ... but no more! <strong>Bevy 0.4</strong> adds a new <code>#[bevy_main]</code> proc-macro, which inserts the relevant boilerplate for you. This is a big step toward our &quot;write once run anywhere&quot; goal.</p> +<p>This Bevy App has all the code required to run on Windows, MacOS, Linux, Android, iOS, and Web:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-other z-rust">use</span> <span class="z-meta z-path z-rust">bevy<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">prelude<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-keyword z-operator z-arithmetic z-rust">*</span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">bevy_main</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="live-shader-reloading">Live Shader Reloading +<a class="anchor-link" href="#live-shader-reloading">#</a> +</h2> +<div class="release-feature-authors">authors: @yrns</div> +<p>Bevy can now update changes to shaders at runtime, giving you instant feedback without restarting your app. This video isn't sped up!</p> +<p><video controls loop><source src="hot_shader_reloading.mp4" type="video/mp4"/></video></p> +<h2 id="ecs-improvements">ECS Improvements +<a class="anchor-link" href="#ecs-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>It wouldn't be a Bevy update without another round of ECS improvements!</p> +<h3 id="flexible-ecs-parameters">Flexible ECS Parameters +<a class="anchor-link" href="#flexible-ecs-parameters">#</a> +</h3> +<p>Prior versions of Bevy forced you to provide system parameters in a specific order:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> This system followed the [Commands][Resources][Queries] order and compiled as expected +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">valid_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, <span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> This system did not follow the required ordering, which caused compilation to fail +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">invalid_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, <span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Newbies would fall prey to this constantly. These completely arbitrary constraints were a quirk of the internal implementation. The <code>IntoSystem</code> trait was only implemented for specific orders. Supporting every order would have exponentially affected compile times. The internal implementation was also constructed with a <a href="https://github.com/bevyengine/bevy/blob/9afe196f1690a6a6e47bf67ac740b4edeffd97bd/crates/bevy_ecs/src/system/into_system.rs#L158">famously complicated macro</a>.</p> +<p>To resolve this, I completely rewrote how we generate systems. We now use a <code>SystemParam</code> trait, which we implement for each parameter type. This has a number of benefits:</p> +<ul> +<li><strong>Significantly Faster Compile Times</strong>: We're seeing a <b style="color: rgb(50, 210, 50)">~25%</b> decrease in clean compile times</li> +<li><strong>Use Any Parameter Order You Want</strong>: No more arbitrary order restrictions!</li> +<li><strong>Easily Add New Parameters</strong>: It is now easy for us (and for users) to create new parameters. Just implement the <code>SystemParam</code> trait!</li> +<li><strong>Simpler Implementation</strong>: The new implementation is much smaller and also way easier to maintain and understand.</li> +</ul> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> In Bevy 0.4 this system is now perfectly valid. Cool! +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Commands, <span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Notice that in <strong>Bevy 0.4</strong>, commands now look like <code>commands: &amp;mut Commands</code> instead of <code>mut commands: Commands</code>.</p> +<h3 id="simplified-query-filters">Simplified Query Filters +<a class="anchor-link" href="#simplified-query-filters">#</a> +</h3> +<p>Up until now, Bevy's Query filters were intermingled with components:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>A, <span class="z-meta z-generic z-rust">Without<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>B, <span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform, <span class="z-meta z-generic z-rust">Changed<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Velocity<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Confused? You wouldn't be the first! You can interpret the query above as &quot;give me immutable references to the <code>Transform</code> and <code>Velocity</code> components of all entities that have the <code>A</code> component, <em>do not</em> have the <code>B</code> component, and have a changed Velocity component&quot;.</p> +<p>First, the nesting of types via With / Without makes it very unclear whats going on. Additionally, it's hard to tell what the <code>Changed&lt;Velocity&gt;</code> parameter does. Is it just a filter? Does it also return a Velocity component? If so, is it immutable or mutable?</p> +<p>It made sense to break up these concepts. In <strong>Bevy 0.4</strong>, Query filters are separate from Query components. The query above looks like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Query with filters +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform, <span class="z-keyword z-operator z-rust">&amp;</span>Velocity<span class="z-punctuation z-section z-group z-end z-rust">)</span>, <span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>A<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-meta z-generic z-rust">Without<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>B<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-meta z-generic z-rust">Changed<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Velocity<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Query without filters +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform, <span class="z-keyword z-operator z-rust">&amp;</span>Velocity<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>This makes it much easier to tell what a Query is doing at a glance. It also makes for more composable behaviors. For example, you can now filter on <code>Changed&lt;Velocity&gt;</code> without actually retrieving the <code>Velocity</code> component.</p> +<p>And now that filters are a separate type, you can create type aliases for filters that you want to re-use:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-type z-rust">type</span> <span class="z-entity z-name z-type z-rust">ChangedVelocity</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">With<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>A<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-generic z-rust">Without<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>B<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-generic z-rust">Changed<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Velocity<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform, <span class="z-keyword z-operator z-rust">&amp;</span>Velocity<span class="z-punctuation z-section z-group z-end z-rust">)</span>, ChangedVelocity<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="system-inputs-outputs-and-chaining">System Inputs, Outputs, and Chaining +<a class="anchor-link" href="#system-inputs-outputs-and-chaining">#</a> +</h3> +<p>Systems can now have inputs and outputs. This opens up a variety of interesting behaviors, such as system error handling:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>result_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">chain</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>error_handler<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">result_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Result</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> transform <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-other z-rust">SOME_ENTITY</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-keyword z-operator z-rust">?</span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>found entity transform: <span class="z-constant z-other z-placeholder z-rust">{:?}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> transform<span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-support z-type z-rust">Ok</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">error_handler_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span>In<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-variable z-parameter z-rust">result</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span>: <span class="z-meta z-generic z-rust">In<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Result</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">error_handler</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyErrorHandler<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Err</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>err</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> result <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + error_handler<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">handle_error</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>err</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>The + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.4.0&#x2F;bevy_ecs/trait.System.html"><code>System</code></a> trait now looks like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Has no inputs and no outputs +</span><span class="z-meta z-generic z-rust">System<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>In = <span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-punctuation z-section z-group z-end z-rust">)</span>, Out = <span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Takes a usize as input and return a f32 +</span><span class="z-meta z-generic z-rust">System<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>In = <span class="z-storage z-type z-rust">usize</span>, Out = <span class="z-storage z-type z-rust">f32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> +</span></code></pre> +<p>We use this feature in our new Schedule implementation.</p> +<h3 id="schedule-v2">Schedule V2 +<a class="anchor-link" href="#schedule-v2">#</a> +</h3> +<p>Bevy's old Schedule was nice. System registrations were easy to read and easy to compose. But it also had significant limitations:</p> +<ul> +<li>Only one Schedule allowed</li> +<li>Very static: you were limited to using the tools we gave you: +<ul> +<li>stages are just lists of systems</li> +<li>stages are added to schedules</li> +<li>stages use hard-coded system runners</li> +</ul> +</li> +<li>Couldn't switch between schedules at runtime</li> +<li>Couldn't easily support &quot;fixed timestep&quot; scenarios</li> +</ul> +<p>To solve these problems, I wrote a new Schedule system from scratch. Before you get worried, these are largely <em>non-breaking</em> changes. The high level &quot;app builder&quot; syntax you know and love is still available:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>my_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h4 id="stage-trait">Stage Trait +<a class="anchor-link" href="#stage-trait">#</a> +</h4> +<p>Stages are now a trait. You can now implement your own + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.4.0&#x2F;bevy_ecs/trait.Stage.html"><code>Stage</code></a> types!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyStage</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">Stage <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">MyStage</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">run</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">self</span>, <span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World, <span class="z-variable z-parameter z-rust">resources</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Resources</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Do stage stuff here. +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> You have unique access to the World and Resources, so you are free to do anything +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="stage-type">Stage Type: + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.4.0&#x2F;bevy_ecs/struct.SystemStage.html"><code>SystemStage</code></a> +<a class="anchor-link" href="#stage-type">#</a> +</h4> +<p>This is basically a &quot;normal&quot; stage. You can add systems to it and you can decide how those systems will be executed (parallel, serial, or custom logic)</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> runs systems in parallel (using the default parallel executor) +</span><span class="z-storage z-type z-rust">let</span> parallel_stage <span class="z-keyword z-operator z-assignment z-rust">=</span> + <span class="z-meta z-path z-rust">SystemStage<span class="z-punctuation z-accessor z-rust">::</span></span>parallel<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> runs systems serially (in registration order) +</span><span class="z-storage z-type z-rust">let</span> serial_stage <span class="z-keyword z-operator z-assignment z-rust">=</span> + <span class="z-meta z-path z-rust">SystemStage<span class="z-punctuation z-accessor z-rust">::</span></span>serial<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> you can also write your own custom SystemStageExecutor +</span><span class="z-storage z-type z-rust">let</span> custom_executor_stage <span class="z-keyword z-operator z-assignment z-rust">=</span> + <span class="z-meta z-path z-rust">SystemStage<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">MyCustomExecutor<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h4 id="stage-type-1">Stage Type: + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.4.0&#x2F;bevy_ecs/struct.Schedule.html"><code>Schedule</code></a> +<a class="anchor-link" href="#stage-type-1">#</a> +</h4> +<p>You read that right! + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.4.0&#x2F;bevy_ecs/struct.Schedule.html"><code>Schedule</code></a> now implements the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.4.0&#x2F;bevy_ecs/trait.Stage.html"><code>Stage</code></a> trait, which means you can nest Schedules within other schedules:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> schedule <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">Schedule<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>update<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">SystemStage<span class="z-punctuation z-accessor z-rust">::</span></span>parallel<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>nested<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Schedule<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>nested_stage<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">SystemStage<span class="z-punctuation z-accessor z-rust">::</span></span>serial<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>b<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h4 id="run-criteria">Run Criteria +<a class="anchor-link" href="#run-criteria">#</a> +</h4> +<p>You can add &quot;run criteria&quot; to any + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.4.0&#x2F;bevy_ecs/struct.SystemStage.html"><code>SystemStage</code></a> or + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.4.0&#x2F;bevy_ecs/struct.Schedule.html"><code>Schedule</code></a>.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> A &quot;run criteria&quot; is just a system that returns a `ShouldRun` result +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">only_on_10_criteria</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">value</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">usize</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> ShouldRun</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-keyword z-operator z-arithmetic z-rust">*</span>value <span class="z-keyword z-operator z-comparison z-rust">==</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">10</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">ShouldRun<span class="z-punctuation z-accessor z-rust">::</span></span>Yes + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> <span class="z-keyword z-control z-rust">else</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">ShouldRun<span class="z-punctuation z-accessor z-rust">::</span></span>No + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this stage only runs when Res&lt;usize&gt; has a value of 10 +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_stage_after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">stage<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">UPDATE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>only_on_10_stage<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">SystemStage<span class="z-punctuation z-accessor z-rust">::</span></span>parallel<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_run_criteria</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>only_on_10_criteria<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>my_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this stage only runs once +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_stage_after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">stage<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">RUN_ONCE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>one_and_done<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Schedule<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_run_criteria</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">RunOnce<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>my_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h4 id="fixed-timestep">Fixed Timestep +<a class="anchor-link" href="#fixed-timestep">#</a> +</h4> +<p>You can now run stages on a &quot;fixed timestep&quot;.</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this stage will run once every 0.4 seconds +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_stage_after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">stage<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">UPDATE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>fixed_update<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">SystemStage<span class="z-punctuation z-accessor z-rust">::</span></span>parallel<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_run_criteria</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">FixedTimestep<span class="z-punctuation z-accessor z-rust">::</span></span>step<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">4</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>my_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>This builds on top of <code>ShouldRun::YesAndLoop</code>, which ensures that the schedule continues to loop until it has consumed all accumulated time.</p> +<p>Check out the excellent <a href="https://gafferongames.com/post/fix_your_timestep/">&quot;Fix Your Timestep!&quot;</a> article if you want to learn more about fixed timesteps.</p> +<h4 id="typed-stage-builders">Typed Stage Builders +<a class="anchor-link" href="#typed-stage-builders">#</a> +</h4> +<p>Now that stages can be any type, we need a way for + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_app&#x2F;0.4.0&#x2F;bevy_app/trait.Plugin.html"><code>Plugin</code></a>s to interact with arbitrary stage types:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this &quot;high level&quot; builder pattern still works (and assumes that the stage is a SystemStage) +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this &quot;low level&quot; builder is equivalent to add_system() +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">stage<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">UPDATE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">stage</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> SystemStage<span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> + </span><span class="z-meta z-function z-closure z-rust">stage<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this works for custom stage types too +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-other z-rust">MY_CUSTOM_STAGE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">stage</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> MyCustomStage<span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> + </span><span class="z-meta z-function z-closure z-rust">stage<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">do_custom_thing</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h3 id="deprecated-for-each-systems">Deprecated For-Each Systems +<a class="anchor-link" href="#deprecated-for-each-systems">#</a> +</h3> +<p>Prior versions of Bevy supported &quot;for-each&quot; systems, which looked like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> on each update this system runs once for each entity with a Transform component +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">entity</span><span class="z-punctuation z-separator z-rust">:</span> Entity, <span class="z-variable z-parameter z-rust">transform</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Mut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do per-entity logic here +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>From now on, the system above should be written like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> on each update this system runs once and internally iterates over each entity +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Entity, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity<span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-modifier z-rust">mut</span> transform</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do per-entity logic here +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>For-each systems were nice to look at and sometimes saved some typing. Why remove them?</p> +<ol> +<li>For-each systems were fundamentally limited in a number of ways. They couldn't iterate removed components, filter, control iteration, or use multiple queries at the same time. This meant they needed to be converted to &quot;query systems&quot; as soon as those features were needed.</li> +<li>Bevy should generally have &quot;one way to do things&quot;. For-each systems were a slightly more ergonomic way to define a small subset of system types. This forced people to make a &quot;design decision&quot; when they shouldn't need to. It also made examples and tutorials inconsistent according to people's preferences for one or the other.</li> +<li>There were a number of &quot;gotchas&quot; for newcomers that constantly come up in our support forums and confused newbies: +<ul> +<li>users expect <code>&amp;mut T</code> queries to work in foreach systems (ex: <code>fn system(a: &amp;mut A) {}</code>). These can't work because we require <code>Mut&lt;T&gt;</code> tracking pointers to ensure change tracking always works as expected. The equivalent <code>Query&lt;&amp;mut A&gt;</code> works because we can return the tracking pointer when iterating the Query.</li> +<li>A &quot;run this for-each system on some criteria&quot; bug that was common enough that we had to cover it in the Bevy Book.</li> +</ul> +</li> +<li>They increased compile times. Removing for-each systems saved me about ~5 seconds on clean Bevy compiles)</li> +<li>Their internal implementation required a complicated macro. This affected maintainability.</li> +</ol> +<h2 id="states">States +<a class="anchor-link" href="#states">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>By popular demand, Bevy now supports States. These are logical &quot;app states&quot; that allow you to enable/disable systems according to the state your app is in.</p> +<p>States are defined as normal Rust enums:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Clone</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-enum z-rust"><span class="z-storage z-type z-enum z-rust">enum</span> <span class="z-entity z-name z-enum z-rust">AppState</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + Loading<span class="z-punctuation z-separator z-rust">,</span> + Menu<span class="z-punctuation z-separator z-rust">,</span> + InGame +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>You then add them to your app as a resource like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> add a new AppState resource that defaults to the Loading state +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">State<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Loading</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>To run systems according to the current state, add a + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.4.0&#x2F;bevy_ecs/struct.StateStage.html"><code>StateStage</code></a>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_stage_after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">stage<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">UPDATE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-other z-rust">STAGE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">StateStage<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AppState<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>You can then add systems for each state value / lifecycle-event like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">on_state_enter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-other z-rust">STAGE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu<span class="z-punctuation z-separator z-rust">,</span> setup_menu<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">on_state_update</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-other z-rust">STAGE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu<span class="z-punctuation z-separator z-rust">,</span> menu<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">on_state_exit</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-other z-rust">STAGE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>Menu<span class="z-punctuation z-separator z-rust">,</span> cleanup_menu<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">on_state_enter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-other z-rust">STAGE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>InGame<span class="z-punctuation z-separator z-rust">,</span> setup_game<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">on_state_update</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-other z-rust">STAGE</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>InGame<span class="z-punctuation z-separator z-rust">,</span> movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Notice that there are different &quot;lifecycle events&quot;:</p> +<ul> +<li><strong>on_enter</strong>: Runs once when first entering a state</li> +<li><strong>on_exit</strong>: Runs once when exiting a state</li> +<li><strong>on_update</strong>: Runs exactly once on every run of the stage (after any on_enter or on_exit events have been run)</li> +</ul> +<p>You can queue a state change from a system like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">state</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">State<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AppState<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + state<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set_next</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">AppState<span class="z-punctuation z-accessor z-rust">::</span></span>InGame</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Queued state changes get applied at the end of the StateStage. If you change state within a StateStage, the lifecycle events will occur in the same update/frame. You can do this any number of times (aka it will continue running state lifecycle systems until no more changes are queued). This ensures that multiple state changes can be applied within the same frame.</p> +<h2 id="gltf-improvements">GLTF Improvements +<a class="anchor-link" href="#gltf-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @iwikal, @FuriouZz, @rod-salazar</div> +<p>Bevy's GLTF loader now imports Cameras. Here is a simple scene setup in Blender:</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/gltf_camera_blender.png" alt="gltf_camera_blender" /></p> +<p>And here is how it looks in Bevy (the lighting is different because we don't import lights yet):</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/gltf_camera_bevy.png" alt="gltf_camera_bevy" /></p> +<p>There were also a number of other improvements:</p> +<ul> +<li>Pixel format conversion while importing images from a GLTF</li> +<li>Default material loading</li> +<li>Hierarchy fixes</li> +</ul> +<h2 id="spawn-scenes-as-children">Spawn Scenes as Children +<a class="anchor-link" href="#spawn-scenes-as-children">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>Scenes can now be spawned as children like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + <span class="z-meta z-path z-rust">Transform<span class="z-punctuation z-accessor z-rust">::</span></span>from_translation<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Vec3<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">GlobalTransform<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">parent</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + parent<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_scene</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>scene.gltf<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>By spawning beneath a parent, this enables you to do things like translate/rotate/scale multiple instances of the same scene:</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/scene_children.png" alt="scene_children" /></p> +<h2 id="dynamic-linking">Dynamic Linking +<a class="anchor-link" href="#dynamic-linking">#</a> +</h2> +<div class="release-feature-authors">authors: @bjorn3, @cart</div> +<p>@bjorn3 discovered that you can force Bevy to dynamically link.</p> +<p>This <em>significantly</em> reduces iterative compile times. Check out how long it takes to compile a change made to the <code>3d_scene.rs</code> example with the <a href="https://bevyengine.org/learn/book/getting-started/setup/">Fast Compiles Config</a> <em>and</em> dynamic linking:</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/dynamic_fast.png" alt="fast dynamic" /></p> +<h3 id="time-to-compile-change-to-3d-scene-example-in-seconds-less-is-better">Time To Compile Change To 3d_scene Example (in seconds, less is better) +<a class="anchor-link" href="#time-to-compile-change-to-3d-scene-example-in-seconds-less-is-better">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-4/fast_compiles.svg" alt="fast_compiles" /></p> +<p>We added a cargo feature to easily enable dynamic linking during development</p> +<pre data-lang="sh" class="language-sh z-code"><code class="language-sh" data-lang="sh"><span class="z-source z-shell z-bash"><span class="z-comment z-line z-number-sign z-shell"><span class="z-punctuation z-definition z-comment z-begin z-shell">#</span></span><span class="z-comment z-line z-number-sign z-shell"> for a bevy app</span><span class="z-comment z-line z-number-sign z-shell"> +</span><span class="z-meta z-function-call z-shell"><span class="z-variable z-function z-shell">cargo</span></span><span class="z-meta z-function-call z-arguments z-shell"> run<span class="z-variable z-parameter z-option z-shell"><span class="z-punctuation z-definition z-parameter z-shell"> --</span>features</span> bevy/dynamic</span> + +<span class="z-comment z-line z-number-sign z-shell"><span class="z-punctuation z-definition z-comment z-begin z-shell">#</span></span><span class="z-comment z-line z-number-sign z-shell"> for bevy examples</span><span class="z-comment z-line z-number-sign z-shell"> +</span><span class="z-meta z-function-call z-shell"><span class="z-variable z-function z-shell">cargo</span></span><span class="z-meta z-function-call z-arguments z-shell"> run<span class="z-variable z-parameter z-option z-shell"><span class="z-punctuation z-definition z-parameter z-shell"> --</span>features</span> dynamic<span class="z-variable z-parameter z-option z-shell"><span class="z-punctuation z-definition z-parameter z-shell"> --</span>example</span> breakout</span> +</span></code></pre> +<p>Just keep in mind that you should disable the feature when publishing your game.</p> +<h2 id="text-layout-improvements">Text Layout Improvements +<a class="anchor-link" href="#text-layout-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @AlisCode, @tigregalis</div> +<p>Prior Bevy releases used a custom, naive text layout system. It had a number of bugs and limitations, such as the infamous &quot;wavy text&quot; bug:</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/wavy_text.png" alt="wavy_text" /></p> +<p>The new text layout system uses glyph_brush_layout, which fixes the layout bugs and adds a number of new layout options. Note that the &quot;Fira Sans&quot; font used in the example has some stylistic &quot;waviness&quot; ... this isn't a bug:</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/text_layout.png" alt="text_layout" /></p> +<h2 id="renderer-optimization">Renderer Optimization +<a class="anchor-link" href="#renderer-optimization">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>Bevy's render API was built to be easy to use and extend. I wanted to nail down a good API first, but that resulted in a number of performance TODOs that caused some pretty serious overhead.</p> +<p>For <strong>Bevy 0.4</strong> I decided to resolve as many of those TODOs as I could. There is still plenty more to do (like instancing and batching), but Bevy already performs <em>much</em> better than it did before.</p> +<h3 id="incrementalize-everything">Incrementalize Everything +<a class="anchor-link" href="#incrementalize-everything">#</a> +</h3> +<p>Most of Bevy's high level render abstractions were designed to be incrementally updated, but when I was first building the engine, ECS change detection wasn't implemented. Now that we have all of these nice optimization tools, it makes sense to use them!</p> +<p>For the first optimization round, I incrementalized as much as I could:</p> +<ul> +<li>Added change detection to RenderResourceNode, Sprites, and Transforms, which improved performance when those values don't change</li> +<li>Only sync asset gpu data when the asset changes</li> +<li>Share asset RenderResourceBindings across all entities that reference an asset</li> +<li>Mesh provider system now only updates mesh specialization when it needs to</li> +<li>Stop clearing bind groups every frame and remove stale bind groups every other frame</li> +<li>Cache unmatched render resource binding results (which prevents redundant computations per-entity per-frame)</li> +<li>Don't send render pass state change commands when the state has not actually changed</li> +</ul> +<h4 id="frame-time-to-draw-10-000-static-sprites-in-milliseconds-less-is-better">Frame Time to Draw 10,000 Static Sprites (in milliseconds, less is better) +<a class="anchor-link" href="#frame-time-to-draw-10-000-static-sprites-in-milliseconds-less-is-better">#</a> +</h4> +<p><img src="https://bevyengine.org/news/bevy-0-4/bevy_round1_static.svg" alt="bevy_round1_static" /></p> +<h4 id="frame-time-to-draw-10-000-moving-sprites-in-milliseconds-less-is-better">Frame Time to Draw 10,000 Moving Sprites (in milliseconds, less is better) +<a class="anchor-link" href="#frame-time-to-draw-10-000-moving-sprites-in-milliseconds-less-is-better">#</a> +</h4> +<p><img src="https://bevyengine.org/news/bevy-0-4/bevy_round1_dynamic.svg" alt="bevy_round1_dynamic" /></p> +<h3 id="optimize-text-rendering-and-other-immediate-rendering">Optimize Text Rendering (and other immediate rendering) +<a class="anchor-link" href="#optimize-text-rendering-and-other-immediate-rendering">#</a> +</h3> +<p>Text Rendering (and anything else that used the <code>SharedBuffers</code> immediate-rendering abstraction) was <em>extremely</em> slow in prior Bevy releases. This was because the <code>SharedBuffers</code> abstraction was a placeholder implementation that didn't actually share buffers. By implementing the &quot;real&quot; <code>SharedBuffers</code> abstraction, we got a pretty significant text rendering speed boost.</p> +<h4 id="frame-time-to-draw-text-debug-example-in-milliseconds-less-is-better">Frame Time to Draw &quot;text_debug&quot; Example (in milliseconds, less is better) +<a class="anchor-link" href="#frame-time-to-draw-text-debug-example-in-milliseconds-less-is-better">#</a> +</h4> +<p><img src="https://bevyengine.org/news/bevy-0-4/text_rendering.svg" alt="text_rendering" /></p> +<h3 id="mailbox-vsync">Mailbox Vsync +<a class="anchor-link" href="#mailbox-vsync">#</a> +</h3> +<p>Bevy now uses wgpu's &quot;mailbox vsync&quot; by default. This reduces input latency on platforms that support it.</p> +<h2 id="reflection">Reflection +<a class="anchor-link" href="#reflection">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>Rust has a pretty big &quot;reflection&quot; gap. For those who aren't aware, &quot;reflection&quot; is a class of language feature that enables you to interact with language constructs at runtime. They add a form of &quot;dynamic-ness&quot; to what are traditionally static language concepts.</p> +<p>We have bits and pieces of reflection in Rust, such as + + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;doc.rust-lang.org/stable&#x2F;std&#x2F;any/struct.TypeId.html"><code>std::any::TypeId</code></a> and + + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;doc.rust-lang.org/stable&#x2F;std&#x2F;any/fn.type_name.html"><code>std::any::type_name</code></a>. But when it comes to interacting with datatypes ... we don't have anything yet. This is unfortunate because some problems are inherently dynamic in nature.</p> +<p>When I was first building Bevy, I decided that the engine would benefit from such features. Reflection is a good foundation for scene systems, Godot-like (or Unity-like) property animation systems, and editor inspection tools. I built the <code>bevy_property</code> and <code>bevy_type_registry</code> crates to fill these needs.</p> +<p>They got the job done, but they were custom-tailored to Bevy's needs, were full of custom jargon (rather than reflecting Rust language constructs directly), didn't handle traits, and had a number of fundamental restrictions on how data could be accessed.</p> +<p>In this release we replaced the old <code>bevy_property</code> and <code>bevy_type_registry</code> crates with a new + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_reflect&#x2F;0.4.0&#x2F;bevy_reflect/index.html"><code>bevy_reflect</code></a> + crate. Bevy Reflect is intended to be a &quot;generic&quot; Rust reflection crate. I'm hoping it will be as useful for non-Bevy projects as it is for Bevy. We now use it for our Scene system, but in the future we will use it for animating Component fields and auto-generating Bevy Editor inspector widgets.</p> +<p>Bevy Reflect enables you to dynamically interact with Rust types by deriving the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_reflect&#x2F;0.4.0&#x2F;bevy_reflect/trait.Reflect.html"><code>Reflect</code></a> trait:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Foo</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">a</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">u32</span>, + <span class="z-variable z-other z-member z-rust">b</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Bar<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, + <span class="z-variable z-other z-member z-rust">c</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Bar</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">value</span><span class="z-punctuation z-separator z-type z-rust">:</span> String +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> I&#39;ll use this value to illustrate `bevy_reflect` features +</span><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> foo <span class="z-keyword z-operator z-assignment z-rust">=</span> Foo <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + a<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-separator z-rust">,</span> + b<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span>Bar <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>hello world<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + c<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-integer z-decimal z-rust">1</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="interact-with-fields-using-their-names">Interact with Fields Using Their Names +<a class="anchor-link" href="#interact-with-fields-using-their-names">#</a> +</h3> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-arithmetic z-rust">*</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_field<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>a<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-keyword z-operator z-arithmetic z-rust">*</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_field_mut<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>a<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span>a<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="patch-your-types-with-new-values">Patch Your Types With New Values +<a class="anchor-link" href="#patch-your-types-with-new-values">#</a> +</h3> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> dynamic_struct <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">DynamicStruct<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +dynamic_struct<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>a<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">42</span><span class="z-storage z-type z-numeric z-rust">u32</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +dynamic_struct<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>c<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-integer z-decimal z-rust">3</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">4</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">5</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">apply</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>dynamic_struct</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span>a<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">42</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span>c<span class="z-punctuation z-separator z-rust">,</span> <span class="z-support z-macro z-rust">vec!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-constant z-numeric z-integer z-decimal z-rust">3</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">4</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">5</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="look-up-nested-fields-using-path-strings">Look Up Nested Fields Using &quot;Path Strings&quot; +<a class="anchor-link" href="#look-up-nested-fields-using-path-strings">#</a> +</h3> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> value <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-keyword z-operator z-arithmetic z-rust">*</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_path<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-support z-type z-rust">String</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>b[0].value<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">as_str</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>hello world<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="iterate-over-struct-fields">Iterate Over Struct Fields +<a class="anchor-link" href="#iterate-over-struct-fields">#</a> +</h3> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>i<span class="z-punctuation z-separator z-rust">,</span> value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>Reflect</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_fields</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">enumerate</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> field_name <span class="z-keyword z-operator z-assignment z-rust">=</span> foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">name_at</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>i</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Ok</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>value</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">downcast_ref<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span> is a u32 with the value: <span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> field_name<span class="z-punctuation z-separator z-rust">,</span> <span class="z-keyword z-operator z-arithmetic z-rust">*</span>value<span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<h3 id="automatically-serialize-and-deserialize-with-serde">Automatically Serialize And Deserialize With Serde +<a class="anchor-link" href="#automatically-serialize-and-deserialize-with-serde">#</a> +</h3> +<p>This doesn't require manual Serde impls!</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> registry <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">TypeRegistry<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +registry<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">register<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +registry<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">register<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-support z-type z-rust">String</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +registry<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">register<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Bar<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-storage z-type z-rust">let</span> serializer <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">ReflectSerializer<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>foo<span class="z-punctuation z-separator z-rust">,</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>registry</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> serialized <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">ron<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">ser<span class="z-punctuation z-accessor z-rust">::</span></span>to_string_pretty<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>serializer<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">ron<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">ser<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">PrettyConfig<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> deserializer <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">ron<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">de<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">Deserializer<span class="z-punctuation z-accessor z-rust">::</span></span>from_str<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>serialized</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> reflect_deserializer <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">ReflectDeserializer<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>registry</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> value <span class="z-keyword z-operator z-assignment z-rust">=</span> reflect_deserializer<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">deserialize</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> deserializer</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> dynamic_struct <span class="z-keyword z-operator z-assignment z-rust">=</span> value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">take<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>DynamicStruct<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-documentation z-rust"><span class="z-punctuation z-definition z-comment z-rust">///</span> reflect has its own partal_eq impl +</span><span class="z-support z-macro z-rust">assert!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>foo<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">reflect_partial_eq</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>dynamic_struct</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="trait-reflection">Trait Reflection +<a class="anchor-link" href="#trait-reflection">#</a> +</h3> +<p>You can now call a trait on a given <code>&amp;dyn Reflect</code> reference without knowing the underlying type! This is a form of magic that should probably be avoided in most situations. But in the few cases where it is completely necessary, it is very useful:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Reflect</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">reflect</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">DoThing</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyType</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">value</span><span class="z-punctuation z-separator z-type z-rust">:</span> String, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">DoThing <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">MyType</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">do_thing</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-variable z-parameter z-rust">self</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> String</span> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">format!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span> World!<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> <span class="z-variable z-language z-rust">self</span><span class="z-punctuation z-accessor z-dot z-rust">.</span>value<span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">reflect_trait</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-trait z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-trait z-rust">trait</span> <span class="z-entity z-name z-trait z-rust">DoThing</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">do_thing</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-variable z-parameter z-rust">self</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> <span class="z-meta z-function z-return-type z-rust"><span class="z-punctuation z-separator z-rust">-&gt;</span> String</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> First, lets box our type as a Box&lt;dyn Reflect&gt; +</span><span class="z-storage z-type z-rust">let</span> reflect_value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Box</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>dyn Reflect<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-support z-type z-rust">Box</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MyType <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Hello<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> +This means we no longer have direct access to MyType or it methods. We can only call Reflect methods on reflect_value. What if we want to call `do_thing` on our type? We could downcast using reflect_value.get::&lt;MyType&gt;(), but what if we don&#39;t know the type at compile time? +<span class="z-punctuation z-definition z-comment z-rust">*/</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Normally in rust we would be out of luck at this point. Lets use our new reflection powers to do something cool! +</span><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> type_registry <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">TypeRegistry<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +type_registry<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">register<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyType<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> +The #[reflect] attribute we put on our DoThing trait generated a new `ReflectDoThing` struct, which implements TypeData. This was added to MyType&#39;s TypeRegistration. +<span class="z-punctuation z-definition z-comment z-rust">*/</span></span> + +<span class="z-storage z-type z-rust">let</span> reflect_do_thing <span class="z-keyword z-operator z-assignment z-rust">=</span> type_registry + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_type_data<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ReflectDoThing<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>reflect_value<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">type_id</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> We can use this generated type to convert our `&amp;dyn Reflect` reference to an `&amp;dyn DoThing` reference +</span><span class="z-storage z-type z-rust">let</span> my_trait<span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>dyn DoThing <span class="z-keyword z-operator z-assignment z-rust">=</span> reflect_do_thing<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-keyword z-operator z-arithmetic z-rust">*</span>reflect_value</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Which means we can now call do_thing(). Magic! +</span><span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> my_trait<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">do_thing</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="3d-texture-assets">3D Texture Assets +<a class="anchor-link" href="#3d-texture-assets">#</a> +</h2> +<div class="release-feature-authors">authors: @bonsairobo</div> +<p>The Texture asset now has support for 3D textures. The new <code>array_texture.rs</code> example illustrates how to load a 3d texture and sample from each &quot;layer&quot;.</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/array_texture.png" alt="array_texture" /></p> +<h2 id="logging-and-profiling">Logging and Profiling +<a class="anchor-link" href="#logging-and-profiling">#</a> +</h2> +<div class="release-feature-authors">authors: @superdump, @cart</div> +<p>Bevy finally has built in logging, which is now enabled by default via the new + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_log&#x2F;0.4.0&#x2F;bevy_log/struct.LogPlugin.html"><code>LogPlugin</code></a>. We evaluated various logging libraries and eventually landed on the new <code>tracing</code> crate. <code>tracing</code> is a structured logger that handles async / parallel logging well (perfect for an engine like Bevy), and enables profiling in addition to &quot;normal&quot; logging.</p> +<p>The + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_log&#x2F;0.4.0&#x2F;bevy_log/struct.LogPlugin.html"><code>LogPlugin</code></a> configures each platform to log to the appropriate backend by default: the terminal on desktop, the console on web, and Android Logs / logcat on Android. We built a new Android <code>tracing</code> backend because one didn't exist yet.</p> +<h3 id="logging">Logging +<a class="anchor-link" href="#logging">#</a> +</h3> +<p>Bevy's internal plugins now generate <code>tracing</code> logs. And you can easily add logs to your own app logic like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> these are imported by default in bevy::prelude::* +</span><span class="z-support z-macro z-rust">trace!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>very noisy<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">debug!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>helpful for debugging<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">info!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>helpful information that is worth printing by default<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">warn!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>something bad happened that isn&#39;t a failure, but thats worth calling out<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">error!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>something failed<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>These lines result in pretty-printed terminal logs:</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/logs.png" alt="logs" /></p> +<p><code>tracing</code> has a ton of useful features like structured logging and filtering. <a href="https://docs.rs/tracing/*/tracing/">Check out their documentation for more info.</a></p> +<h3 id="profiling">Profiling +<a class="anchor-link" href="#profiling">#</a> +</h3> +<p>We have added the option to add &quot;tracing spans&quot; to all ECS systems by enabling the <code>trace</code> feature. We also have built in support for the <code>tracing-chrome</code> extension, which causes Bevy to output traces in the &quot;chrome tracing&quot; format.</p> +<p>If you run your app with <code>cargo run --features bevy/trace,bevy/trace_chrome</code> you will get a json file which can be opened in Chrome browsers by visiting the <code>chrome://tracing</code> url:</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/profiling.png" alt="profiling" /></p> +<p>@superdump added support for those nice &quot;span names&quot; to upstream <code>tracing_chrome</code>.</p> +<h2 id="hidpi">HIDPI +<a class="anchor-link" href="#hidpi">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf, @blunted2night, @cart</div> +<p>Bevy now handles HIDPI / Retina / high pixel density displays properly:</p> +<ul> +<li>OS-reported pixel density is now taken into account when creating windows. If a Bevy App asks for a 1280x720 window on a 2x pixel density display, it will create a window that is 2560x1440</li> +<li>Window width/height is now reported in &quot;logical units&quot; (1280x720 in the example above). Physical units are still available using the <code>window.physical_width()</code> and <code>window.physical_height()</code> methods.</li> +<li>Window &quot;swap chains&quot; are created using the physical resolution to ensure we still have crisp rendering (2560x1440 in the example above)</li> +<li>Bevy UI has been adapted to handle HIDPI scaling correctly</li> +</ul> +<p>There is still a bit more work to be done here. While Bevy UI renders images and boxes at crisp HIDPI resolutions, text is still rendered using the logical resolution, which means it won't be as crisp as it could be on HIDPI displays.</p> +<h2 id="timer-improvements">Timer Improvements +<a class="anchor-link" href="#timer-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @amberkowalski, @marcusbuffett, @CleanCut</div> +<p>Bevy's Timer component/resource got a number of quality-of-life improvements: pausing, field accessor methods, ergonomics improvements, and internal refactoring / code quality improvements. Timer Components also no longer tick by default. Timer resources and newtyped Timer components couldn't tick by default, so it was a bit inconsistent to have the (relatively uncommon) &quot;unwrapped component Timer&quot; auto-tick.</p> +<p>The timer API now looks like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyTimer</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">timer</span><span class="z-punctuation z-separator z-type z-rust">:</span> Timer, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MyTimer <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> a five second non-repeating timer +</span> timer<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Timer<span class="z-punctuation z-accessor z-rust">::</span></span>from_seconds<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">5.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-language z-rust">false</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>timer_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">timer_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">my_timer</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyTimer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> my_timer<span class="z-punctuation z-accessor z-dot z-rust">.</span>timer<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">tick</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>time<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">delta_seconds</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">just_finished</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>five seconds have passed<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="task-system-improvements">Task System Improvements +<a class="anchor-link" href="#task-system-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @aclysma</div> +<p>@aclysma changed how Bevy Tasks schedules work, which increased performance in the <code>breakout.rs</code> example game by <b style="color: rgb(50, 210, 50)">~20%</b> and resolved a <a href="https://github.com/bevyengine/bevy/pull/892">deadlock</a> when a Task Pool is configured to only have one thread. Tasks are now executed on the calling thread immediately when there is only one task to run, which cuts down on the overhead of moving work to other threads / blocking on them to finish.</p> +<h2 id="apple-silicon-support">Apple Silicon Support +<a class="anchor-link" href="#apple-silicon-support">#</a> +</h2> +<div class="release-feature-authors">authors: @frewsxcv, @wyhaya, @scoopr</div> +<p>Bevy now runs on Apple silicon thanks to upstream work on winit (@scoopr) and coreaudio-sys (@wyhaya). @frewsxcv and @wyhaya updated Bevy's dependencies and verified that it builds/runs on Apple's new chips.</p> +<h2 id="new-examples">New Examples +<a class="anchor-link" href="#new-examples">#</a> +</h2> +<h3 id="bevy-contributors">Bevy Contributors +<a class="anchor-link" href="#bevy-contributors">#</a> +</h3> +<div class="release-feature-authors">author: @karroffel</div> +<p>@karroffel added a fun example that represents each Bevy contributor as a &quot;Bevy Bird&quot;. It scrapes the latest contributor list from git.</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/contributors.png" alt="contributors" /></p> +<h3 id="bevymark">BevyMark +<a class="anchor-link" href="#bevymark">#</a> +</h3> +<div class="release-feature-authors">author: @robdavenport</div> +<p>A &quot;bunnymark-style&quot; benchmark illustrating Bevy's sprite rendering performance. This was useful when implementing the renderer optimizations mentioned above.</p> +<p><img src="https://bevyengine.org/news/bevy-0-4/bevymark.png" alt="bevymark" /></p> +<h2 id="change-log">Change Log +<a class="anchor-link" href="#change-log">#</a> +</h2> +<h3 id="added">Added +<a class="anchor-link" href="#added">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/273">add bevymark benchmark example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/772">gltf: support camera and fix hierarchy</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/789">Add tracing spans to schedules, stages, systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/801">add example that represents contributors as bevy icons</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/805">Add received character</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/808">Add bevy_dylib to force dynamic linking of bevy</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/815">Added RenderPass::set_scissor_rect</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/836"><code>bevy_log</code></a> +<ul> +<li>Adds logging functionality as a Plugin.</li> +<li>Changes internal logging to work with the new implementation.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/847">cross-platform main function</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/852">Controllable ambient light color</a> +<ul> +<li>Added a resource to change the current ambient light color for PBR.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/859">Added more basic color constants</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/883">Add box shape</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/894">Expose an EventId for events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/876">System Inputs, Outputs, and Chaining</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/894">Expose an <code>EventId</code> for events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/917">Added <code>set_cursor_position</code> to <code>Window</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/926">Added new Bevy reflection system</a> +<ul> +<li>Replaces the properties system</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/928">Add support for Apple Silicon</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/937">Live reloading of shaders</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/940">Store mouse cursor position in Window</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/945">Add removal_detection example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/946">Additional vertex attribute value types</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/956">Added WindowFocused event</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/979">Tracing chrome span names</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1004">Allow windows to be maximized</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1016">GLTF: load default material</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1026">can spawn a scene from a ChildBuilder, or directly set its parent when spawning it</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1038">add ability to load <code>.dds</code>, <code>.tga</code>, and <code>.jpeg</code> texture formats</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1037">add ability to provide custom a <code>AssetIo</code> implementation</a></li> +</ul> +<h3 id="changed">Changed +<a class="anchor-link" href="#changed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/691">delegate layout reflection to RenderResourceContext</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/719">Fall back to remove components one by one when failing to remove a bundle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/761">Port hecs derive macro improvements</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/765">Use glyph_brush_layout and add text alignment support</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/791">upgrade glam and hexasphere</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/798">Flexible ECS Params</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/820">Make Timer.tick return &amp;Self</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/821">FileAssetIo includes full path on error</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/829">Removed ECS query APIs that could easily violate safety from the public interface</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/834">Changed Query filter API to be easier to understand</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/842">bevy_render: delegate buffer aligning to render_resource_context</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/843">wasm32: non-spirv shader specialization</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/863">Renamed XComponents to XBundle</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/864">Check for conflicting system resource parameters</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/887">Tweaks to TextureAtlasBuilder.finish()</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/893">do not spend time drawing text with is_visible = false</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/903">Extend the Texture asset type to support 3D data</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/914">Breaking changes to timer API</a> +<ul> +<li>Created getters and setters rather than exposing struct members.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/931">Removed timer auto-ticking system</a> +<ul> +<li>Added an example of how to tick timers manually.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/932">When a task scope produces &lt;= 1 task to run, run it on the calling thread immediately</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/934">Breaking changes to Time API</a> +<ul> +<li>Created getters to get <code>Time</code> state and made members private.</li> +<li>Modifying <code>Time</code>'s values directly is no longer possible outside of bevy.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/920">Use <code>mailbox</code> instead of <code>fifo</code> for vsync on supported systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/947">switch winit size to logical to be dpi independent</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/952">Change bevy_input::Touch API to match similar APIs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/955">Run parent-update and transform-propagation during the &quot;post-startup&quot; stage (instead of &quot;startup&quot;)</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/958">Renderer Optimization Round 1</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/969">Change<code>TextureAtlasBuilder</code> into expected Builder conventions</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/972">Optimize Text rendering / SharedBuffers</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/973">hidpi swap chains</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/987">optimize asset gpu data transfer</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/995">naming coherence for cameras</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1021">Schedule v2</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1027">Use shaderc for aarch64-apple-darwin</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1033">update <code>Window</code>'s <code>width</code> &amp; <code>height</code> methods to return <code>f32</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1034">Break out Visible component from Draw</a> +<ul> +<li>Users setting <code>Draw::is_visible</code> or <code>Draw::is_transparent</code> should now set <code>Visible::is_visible</code> and <code>Visible::is_transparent</code></li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/1043"><code>winit</code> upgraded from version 0.23 to version 0.24</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1071">set is_transparent to true by default for UI bundles</a></li> +</ul> +<h3 id="fixed">Fixed +<a class="anchor-link" href="#fixed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/857">Fixed typos in KeyCode identifiers</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/871">Remove redundant texture copies in TextureCopyNode</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/892">Fix a deadlock that can occur when using scope() on ComputeTaskPool from within a system</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/893">Don't draw text that isn't visible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/895">Use <code>instant::Instant</code> for WASM compatibility</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/897">Fix pixel format conversion in bevy_gltf</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/904">Fixed duplicated children when spawning a Scene</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/905">Corrected behaviour of the UI depth system</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/908">Allow despawning of hierarchies in threadlocal systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/948">Fix <code>RenderResources</code> index slicing</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/955">Run parent-update and transform-propagation during the &quot;post-startup&quot; stage</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/966">Fix collision detection by comparing abs() penetration depth</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/997">deal with rounding issue when creating the swap chain</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1023">only update components for entities in map</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/1035">Don't panic when attempting to set shader defs from an asset that hasn't loaded yet</a></li> +</ul> +<h2 id="contributors">Contributors +<a class="anchor-link" href="#contributors">#</a> +</h2> +<p>A huge thanks to the <strong>66 contributors</strong> that made this release (and associated docs) possible!</p> +<ul> +<li>@0x6273</li> +<li>@aclysma</li> +<li>@ak-1</li> +<li>@alec-deason</li> +<li>@AlisCode</li> +<li>@amberkowalski</li> +<li>@bjorn3</li> +<li>@blamelessgames</li> +<li>@blunted2night</li> +<li>@bonsairobo</li> +<li>@cart</li> +<li>@CleanCut</li> +<li>@ColdIce1605</li> +<li>@dallenng</li> +<li>@e00E</li> +<li>@easynam</li> +<li>@frewsxcv</li> +<li>@FuriouZz</li> +<li>@Git0Shuai</li> +<li>@iMplode-nZ</li> +<li>@iwikal</li> +<li>@jcornaz</li> +<li>@Jerald</li> +<li>@joshuajbouw</li> +<li>@julhe</li> +<li>@karroffel</li> +<li>@Keats</li> +<li>@Kurble</li> +<li>@lassade</li> +<li>@lukors</li> +<li>@marcusbuffett</li> +<li>@marius851000</li> +<li>@memoryruins</li> +<li>@MGlolenstine</li> +<li>@milkybit</li> +<li>@MinerSebas</li> +<li>@mkhan45</li> +<li>@mockersf</li> +<li>@Moxinilian</li> +<li>@mrk-its</li> +<li>@mvlabat</li> +<li>@nic96</li> +<li>@no1hitjam</li> +<li>@octtep</li> +<li>@OptimisticPeach</li> +<li>@Plecra</li> +<li>@PrototypeNM1</li> +<li>@rmsthebest</li> +<li>@RobDavenport</li> +<li>@robertwayne</li> +<li>@rod-salazar</li> +<li>@sapir</li> +<li>@sburris0</li> +<li>@sdfgeoff</li> +<li>@shirshak55</li> +<li>@smokku</li> +<li>@steveyen</li> +<li>@superdump</li> +<li>@SvenTS</li> +<li>@tangmi</li> +<li>@thebluefish</li> +<li>@Tiagojdferreira</li> +<li>@tigregalis</li> +<li>@toothbrush7777777</li> +<li>@Veykril</li> +<li>@yrns</li> +</ul> + + + + Bevy 0.3 + 2020-11-03T00:00:00+00:00 + 2020-11-03T00:00:00+00:00 + + https://bevyengine.org/news/bevy-0-3/ + <p>A little over a month after releasing Bevy 0.2, and thanks to <strong>59</strong> contributors, <strong>122</strong> pull requests, and our <a href="https://github.com/sponsors/cart"><strong>generous sponsors</strong></a>, I'm happy to announce the <strong>Bevy 0.3</strong> release on <a href="https://crates.io/crates/bevy">crates.io</a>!</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out <a href="/learn/book/getting-started/">Quick Start Guide</a> to get started. Bevy is also free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub.</p> +<p>Here are some of the highlights from this release:</p> +<span id="continue-reading"></span><h2 id="initial-android-support">Initial Android Support +<a class="anchor-link" href="#initial-android-support">#</a> +</h2> +<div class="release-feature-authors">authors: @enfipy, @PrototypeNM1, @endragor, @naithar</div> +<p>You can try out the <a href="https://github.com/bevyengine/bevy/tree/v0.3.0/examples/android">Bevy Android example</a> by following the <a href="https://github.com/bevyengine/bevy/blob/v0.3.0/examples/README.md#android">instructions here</a>. While many things work, please note that this is <em>very hot</em> off the presses. Some features will work and others probably won't. Now is a great time to dive in and help us close the gaps!</p> +<p><img src="https://bevyengine.org/news/bevy-0-3/android.png" alt="android" /></p> +<p>This was a massive group effort that spanned multiple projects:</p> +<ul> +<li>Bevy: rewrote bevy-glsl-to-spirv to support android / static libraries (@PrototypeNM1, @enfipy)</li> +<li>Bevy: <code>bevy_asset</code> backend using Android Asset Manager (@enfipy)</li> +<li>Bevy: Touch support (@naithar)</li> +<li>Bevy: Texture format fix (@enfipy)</li> +<li>Bevy: UI touch fixes, touch force, and android example (@enfipy)</li> +<li>Cpal: android audio support (@endragor)</li> +<li>android-ndk-rs / cargo-apk: fix to support Bevy project structure (@PrototypeNM1)</li> +</ul> +<h2 id="initial-ios-support">Initial iOS Support +<a class="anchor-link" href="#initial-ios-support">#</a> +</h2> +<div class="release-feature-authors">authors: @simlay, @MichaelHills, @Dash-L, @naithar</div> +<p>Bevy can now run on iOS!</p> +<img src="ios.png" style="margin-left: -4rem; margin-bottom: -5rem; margin-top: -3rem" /> +<p>You can try out the <a href="https://github.com/bevyengine/bevy/tree/v0.3.0/examples/ios">Bevy iOS example</a> by following the <a href="https://github.com/bevyengine/bevy/tree/v0.3.0/examples#ios">instructions here</a>. This one is also hot off the presses: some features will work and others probably won't.</p> +<p>This was another large group effort that spanned multiple projects:</p> +<ul> +<li>Bevy: XCode Project / Example (@simlay with help from @MichaelHills)</li> +<li>Bevy: Runtime shader compilation using shaderc (@MichaelHills)</li> +<li>Bevy: Rodio upgrade (@Dash-L)</li> +<li>Bevy: Touch support (@naithar)</li> +<li>Winit: Fix iOS portrait view (@MichaelHills)</li> +<li>RustAudio: iOS support (@simlay and @MichaelHills)</li> +</ul> +<p>Known issues:</p> +<ul> +<li><a href="https://github.com/RustAudio/cpal/pull/485">Audio doesn't quite work yet</a></li> +</ul> +<h2 id="wasm-asset-loading">WASM Asset Loading +<a class="anchor-link" href="#wasm-asset-loading">#</a> +</h2> +<div class="release-feature-authors">authors: @mrk-its (and ported to the new AssetIo by @cart)</div> +<p>@mrk-its has been hard at work on expanding Bevy's WASM support. In this release we landed WASM asset loading. You can now load assets when you publish to WASM just like you would on any other platform:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>sprite.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>If the asset hasn't already been loaded, this will make a <code>fetch()</code> request to retrieve the asset over HTTP.</p> +<p>@mrk-its has also been building a custom WebGL2 <code>bevy_render</code> backend. It is already pretty usable, but its not <em>quite</em> ready yet. Expect more news on this soon!</p> +<h2 id="touch-input">Touch Input +<a class="anchor-link" href="#touch-input">#</a> +</h2> +<div class="release-feature-authors">authors: @naithar</div> +<p>Bevy now has support for touches:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">touch_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">touches</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Touches<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> you can iterate all current touches and retrieve their state like this: +</span> <span class="z-keyword z-control z-rust">for</span> touch <span class="z-keyword z-operator z-rust">in</span> touches<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>active touch: <span class="z-constant z-other z-placeholder z-rust">{:?}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> touch<span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-keyword z-control z-rust">for</span> touch <span class="z-keyword z-operator z-rust">in</span> touches<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_just_pressed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>just pressed <span class="z-constant z-other z-placeholder z-rust">{:?}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> touch<span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-keyword z-control z-rust">for</span> touch <span class="z-keyword z-operator z-rust">in</span> touches<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_just_released</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>just released <span class="z-constant z-other z-placeholder z-rust">{:?}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> touch<span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-keyword z-control z-rust">for</span> touch <span class="z-keyword z-operator z-rust">in</span> touches<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_just_cancelled</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>just cancelled <span class="z-constant z-other z-placeholder z-rust">{:?}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> touch<span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>You can also consume raw touch events using the <code>Events&lt;TouchInput&gt;</code> resource.</p> +<h2 id="asset-system-improvements">Asset System Improvements +<a class="anchor-link" href="#asset-system-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<h3 id="asset-handle-reference-counting">Asset Handle Reference Counting +<a class="anchor-link" href="#asset-handle-reference-counting">#</a> +</h3> +<p>Assets are now automatically freed when their &quot;handle reference count&quot; reaches zero. This means you no longer need to think about freeing assets manually:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Calling load() now returns a strong handle: +</span><span class="z-storage z-type z-rust">let</span> handle <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>sprite.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Note that you no longer need to unwrap() loaded handles. Ergonomics for the win! +</span> +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Cloning a handle increases the reference count by one +</span><span class="z-storage z-type z-rust">let</span> second_handle <span class="z-keyword z-operator z-assignment z-rust">=</span> handle<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">clone</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Spawn a sprite and give it our handle +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>handle<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Later in some other system: +</span>commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">despawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>sprite_entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> There are no more active handles to &quot;sprite.png&quot;, so it will be freed before the next update +</span></span></code></pre> +<h3 id="asset-loaders-can-now-load-multiple-assets">Asset Loaders can now load multiple assets +<a class="anchor-link" href="#asset-loaders-can-now-load-multiple-assets">#</a> +</h3> +<p>In past releases, <code>AssetLoaders</code> could only produce a single asset of a single type. In <strong>Bevy 0.3</strong>, they can now produce any number of assets for any type. The old behavior was extremely limiting when loading assets like GLTF files, which might produce many meshes, textures, and scenes.</p> +<h3 id="sub-asset-loading">Sub-Asset Loading +<a class="anchor-link" href="#sub-asset-loading">#</a> +</h3> +<p>Sometimes you only want to load a specific asset from an asset source. You can now load sub assets like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Mesh0/Primitive0 references the first mesh primitive in &quot;my_scene.gltf&quot; +</span><span class="z-storage z-type z-rust">let</span> mesh <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>my_scene.gltf#Mesh0/Primitive0<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="assetio-trait">AssetIo Trait +<a class="anchor-link" href="#assetio-trait">#</a> +</h3> +<p>The <code>AssetServer</code> is now backed by the <code>AssetIo</code> trait. This allows us to load assets from whatever storage we want. This means on desktop we now load from the filesystem, on Android we use the Android Asset Manager, and on the web we make HTTP requests using the <code>fetch()</code> API.</p> +<h3 id="asset-dependencies">Asset Dependencies +<a class="anchor-link" href="#asset-dependencies">#</a> +</h3> +<p>Assets can now depend on other assets, which will automatically be loaded when the original asset is loaded. This is useful when loading something like a &quot;scene&quot; which might reference other asset sources. We utilize this in our new GLTF loader.</p> +<h3 id="removed-assetserver-load-sync">Removed AssetServer::load_sync() +<a class="anchor-link" href="#removed-assetserver-load-sync">#</a> +</h3> +<p>This might rustle some feathers, but <code>AssetServer::load_sync()</code> had to go! This API wasn't WASM friendly, encouraged users to block game execution for the sake of convenience (which causes &quot;hitching&quot;), and was incompatible with the new AssetLoader API. Asset loading is now always asynchronous. Users of <code>load_sync()</code> should instead <code>load()</code> their assets, check load status in their systems, and change game state accordingly.</p> +<h2 id="gltf-scene-loader">GLTF Scene Loader +<a class="anchor-link" href="#gltf-scene-loader">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>Up until this point, the GLTF loader was painfully limited. It could only load the first mesh with a single texture in a GLTF file. For <strong>Bevy 0.3</strong>, we took advantage of the asset system improvements to write a new <code>GltfLoader</code> that loads GLTF files as Bevy <code>Scenes</code>, along with all meshes and textures in the files.</p> +<p>Here's Bevy loading the Khronos Flight Helmet example, which consists of multiple meshes and textures!</p> +<p><img src="https://bevyengine.org/news/bevy-0-3/flight_helmet.png" alt="flight helmet" /></p> +<p>Here is the complete code for a system that loads a GLTF file and spawns it as a scene:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">load_gltf_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, <span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> scene_handle <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>models/FlightHelmet/FlightHelmet.gltf<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn_scene</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>scene_handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="bevy-ecs-improvements">Bevy ECS Improvements +<a class="anchor-link" href="#bevy-ecs-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<h3 id="query-ergonomics">Query Ergonomics +<a class="anchor-link" href="#query-ergonomics">#</a> +</h3> +<p>In this release I finally was able to remove the one thing I <em>truly despised</em> in Bevy ECS. In previous versions of Bevy, iterating over the components in a <code>Query</code> looked like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> The `&amp;mut` here just felt so unnatural +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Or if you preferred you could do this +</span><span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> query.iter().iter()? Really??? +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>Similarly, retrieving a specific entity's component's looked like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Ok</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> result</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> result<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> access components here +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>In <strong>Bevy 0.3</strong> you can just do this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> iteration +</span><span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> sweet ergonomic bliss +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> entity lookup +</span><span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Ok</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span>b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> boilerplate be gone! +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span></code></pre> +<p>You might naturally be thinking something like:</p> +<p><em>Why did this take so long? Why would removing a single <code>&amp;mut</code> be hard?</em></p> +<p>It's a long story! In summary:</p> +<ul> +<li>The old API looked the way it did for a reason. It was the result of good design choices that protect against unsafe memory access in a parallel environment.</li> +<li><code>query.iter()</code> didn't actually return an iterator. It returned a <em>wrapper</em> that held an atomic lock on the component storages. The same was true for the type returned by <code>query.entity()</code></li> +<li>Removing these &quot;wrapper types&quot; would have allowed unsafe behavior because another Query could access the same components in a way that violated Rust's mutability rules.</li> +<li>Due to the iterator implementation and quirks in the rust compiler, removing the wrapper type <em>tanked</em> iteration performance by about ~2-3x.</li> +</ul> +<p>Fortunately we finally found ways to solve all of these problems. The newly added <code>QuerySets</code> allow us to completely remove the locks (and wrapper types). And by completely rewriting <code>QueryIter</code> we were able to avoid the performance hit that removing the wrapper incurred. Read on for the details!</p> +<h3 id="100-lockless-parallel-ecs">100% Lockless Parallel ECS +<a class="anchor-link" href="#100-lockless-parallel-ecs">#</a> +</h3> +<p>Bevy ECS is now completely lock free. In Bevy 0.2, we made direct <code>World</code> access and &quot;for-each&quot; systems lock free. This is possible because the Bevy ECS scheduler ensures that systems only run in parallel in ways that respect Rust's mutability rules.</p> +<p>We couldn't remove locks from <code>Query</code> systems because of systems like this:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">conflicting_query_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">q0</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">q1</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A, <span class="z-keyword z-operator z-rust">&amp;</span>B<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> a <span class="z-keyword z-operator z-assignment z-rust">=</span> q0<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>another_a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> q1<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Aaah!!! We have two mutable references to some_entity&#39;s A component! +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Very unsafe! +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>The locks ensured that the second <code>q1.get_mut(some_entity)</code> access panicked, keeping us nice and safe. In <strong>Bevy 0.3</strong>, a system like <code>conflicting_query_system</code> will fail when the schedule is constructed. By default, <em>systems cannot have conflicting queries</em>.</p> +<p>However there are some cases where a system <em>needs</em> conflicting queries to do what it needs to do. For these cases, we added <code>QuerySets</code>:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">queries</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">QuerySet<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> A, <span class="z-keyword z-operator z-rust">&amp;</span>B<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> a <span class="z-keyword z-operator z-rust">in</span> queries<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">q0_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>a<span class="z-punctuation z-separator z-rust">,</span> b</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> queries<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">q1_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>By putting our conflicting <code>Queries</code> in a <code>QuerySet</code>, the Rust borrow checker protects us from unsafe query accesses.</p> +<p>Because of this, we were able to remove <em>all</em> safety checks from <code>query.iter()</code> and <code>query.get(entity)</code>, which means these methods are now <em>exactly</em> as fast as their <code>World</code> counterparts (which we made lock-free in Bevy 0.2).</p> +<h3 id="performance-improvements">Performance Improvements +<a class="anchor-link" href="#performance-improvements">#</a> +</h3> +<p>Bevy had a number of nice performance improvements this release:</p> +<ul> +<li>Removed atomic locks from Query access, making Bevy ECS 100% lock free</li> +<li>Removed archetype &quot;safety checks&quot; from Query access. At this point we have already verified that the given Query access is safe, so we don't need to check again on every call.</li> +<li>Rewrote <code>QueryIter</code> to be simpler (and therefore easier to control optimizations for), which allowed us to remove the iterator wrapper without tanking performance. This also resolved some performance inconsistencies where some system permutations performed optimally and others didn't. Now everything is on the &quot;fast path&quot;!</li> +<li>Ported some performance improvements from upstream hecs, which improved iteration over heavily fragmented archetypes and improved component insertion times</li> +</ul> +<h4 id="getting-an-entity-s-component-per-100k-in-milliseconds-smaller-is-better">Getting an Entity's Component (per 100k, in milliseconds, smaller is better) +<a class="anchor-link" href="#getting-an-entity-s-component-per-100k-in-milliseconds-smaller-is-better">#</a> +</h4> +<p>Note: these numbers are for getting a component 100,000 times, not for an individual component lookup</p> +<p><img src="https://bevyengine.org/news/bevy-0-3/ecs_get_component.svg" alt="getting an entity's component" /></p> +<p>This is where the big wins were. By removing locks and safety checks from Query systems, we were able to <em>significantly</em> reduce the cost of retrieving a specific entity's component from within a system.</p> +<p>I included a comparison to <a href="https://github.com/amethyst/legion">Legion ECS</a> (another great archetypal ECS with a parallel scheduler) to illustrate why Bevy's new approach is so cool. Legion exposes a direct &quot;world like&quot; API (called a SubWorld) in its systems. The SubWorld's entry API <em>cannot</em> know ahead of time what types will be passed into it, which means it <em>must</em> do (relatively) expensive safety checks to ensure the user doesn't request access to something they shouldn't.</p> +<p>Bevy's scheduler pre-checks <code>Queries</code> once ahead of time, which allows systems to access their results without any additional checks.</p> +<p>The test was to lookup (and modify) a specific entity's component 100,000 times on each system iteration. Here is a quick rundown of how these tests were performed in each case:</p> +<ul> +<li>bevy (world): Direct <code>World</code> access using <code>world.get_mut::&lt;A&gt;(entity)</code></li> +<li>bevy (system): A system containing a <code>Query&lt;&amp;mut A&gt;</code> that accesses the component using <code>query.get_mut(entity)</code></li> +<li>legion (world): Direct <code>World</code> access using <code>let entry = world.entry(entity); entry.get_component_mut::&lt;A&gt;()</code></li> +<li>legion (system): A system with <code>SubWorld</code> access using <code>let entry = world.entry(entity); entry.get_component_mut::&lt;A&gt;()</code></li> +</ul> +<p>It's worth noting that using <code>query.get_component::&lt;T&gt;(entity)</code> instead of <code>query.get(entity)</code> does require safety checks, for the same reason the legion entry API does. We cannot know ahead of time what component type a caller will pass into the method, which means we <em>must</em> check it to make sure it matches the <code>Query</code>.</p> +<p>Additionally, here are some relevant <a href="https://github.com/rust-gamedev/ecs_bench_suite">ecs_bench_suite</a> results (omitted benchmarks had no significant change):</p> +<h4 id="component-insertion-in-microseconds-smaller-is-better">Component Insertion (in microseconds, smaller is better) +<a class="anchor-link" href="#component-insertion-in-microseconds-smaller-is-better">#</a> +</h4> +<p><img src="https://bevyengine.org/news/bevy-0-3/ecs_simple_insert.svg" alt="component insertion" /></p> +<h4 id="component-add-remove-in-milliseconds-smaller-is-better">Component Add/Remove (in milliseconds, smaller is better) +<a class="anchor-link" href="#component-add-remove-in-milliseconds-smaller-is-better">#</a> +</h4> +<p><img src="https://bevyengine.org/news/bevy-0-3/ecs_add_remove.svg" alt="component add/remove" /></p> +<h4 id="fragmented-iteration-in-nanoseconds-smaller-is-better">Fragmented Iteration (in nanoseconds, smaller is better) +<a class="anchor-link" href="#fragmented-iteration-in-nanoseconds-smaller-is-better">#</a> +</h4> +<p><img src="https://bevyengine.org/news/bevy-0-3/ecs_frag_iter.svg" alt="fragmented iteration" /></p> +<h3 id="thread-local-resources">Thread Local Resources +<a class="anchor-link" href="#thread-local-resources">#</a> +</h3> +<p>Some resource types cannot (or should not) be passed between threads. This is often true for low level apis like windowing, input, and audio. It is now possible to add &quot;thread local resources&quot; to the <code>Resources</code> collection, which can only be accessed from the main thread using &quot;thread local systems&quot;:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> in your app setup +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_thread_local_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MyResource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> a thread local system +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World, <span class="z-variable z-parameter z-rust">resources</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Resources</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> my_resource <span class="z-keyword z-operator z-assignment z-rust">=</span> resources<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get_thread_local<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyResource<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="query-api-changes">Query Api Changes +<a class="anchor-link" href="#query-api-changes">#</a> +</h3> +<p>First, to improve clarity we renamed <code>query.get::&lt;Component&gt;(entity)</code> to <code>query.get_component::&lt;Component&gt;(entity)</code>. We now return the &quot;full&quot; query result for a specific entity using <code>query.get(entity)</code>.</p> +<p>To allow multiple concurrent reads of Queries (where it is safe), we added separate <code>query.iter()</code> and <code>query.iter_mut()</code> apis, as well as <code>query.get(entity)</code> and <code>query.get_mut(entity)</code>. Queries that are &quot;read only&quot; can now retrieve their results via an immutable borrow.</p> +<h2 id="mesh-improvements">Mesh Improvements +<a class="anchor-link" href="#mesh-improvements">#</a> +</h2> +<h3 id="flexible-mesh-vertex-attributes">Flexible Mesh Vertex Attributes +<a class="anchor-link" href="#flexible-mesh-vertex-attributes">#</a> +</h3> +<div class="release-feature-authors">authors: @julhe</div> +<p>Bevy meshes used to require exactly three &quot;vertex attributes&quot;: <code>position</code>, <code>normal</code>, and <code>uv</code>. This worked for most things, but there are a number of cases that require other attributes, such as &quot;vertex colors&quot; or &quot;bone weights for animation&quot;. <strong>Bevy 0.3</strong> adds support for custom vertex attributes. Meshes can define whatever attributes they want and shaders can consume whatever attributes they want!</p> +<p><a href="https://github.com/bevyengine/bevy/blob/v0.3.0/examples/shader/mesh_custom_attribute.rs">Here is an example</a> that illustrates how to define a custom shader that consumes a mesh with an added &quot;vertex color&quot; attribute.</p> +<p><img src="https://bevyengine.org/news/bevy-0-3/custom_vertex_attribute.png" alt="custom_vertex_attribute" /></p> +<h3 id="index-buffer-specialization">Index Buffer Specialization +<a class="anchor-link" href="#index-buffer-specialization">#</a> +</h3> +<div class="release-feature-authors">authors: @termhn</div> +<p>Rendering meshes often involves using vertex &quot;indices&quot; to cut down on duplicate vertex information. Bevy used to hard code the precision of these indices to <code>u16</code>, which was too small for some cases. Now render pipelines can &quot;specialize&quot; based on a configured index buffer, which now defaults to <code>u32</code> to cover most use cases.</p> +<h2 id="transform-re-rewrite">Transform Re-Rewrite +<a class="anchor-link" href="#transform-re-rewrite">#</a> +</h2> +<div class="release-feature-authors">authors: @MarekLg (with some design help from @AThilenius, @bitshifter, @termhn, and @cart)</div> +<p>Transforms are important to get right. They are used in many slices of the engine, user code touches them constantly, and they are relatively expensive to compute: especially transform hierarchies.</p> +<p>In the last release, we vastly simplified Bevy's transform system to use a consolidated <code>Transform</code> and <code>GlobalTransform</code> instead of multiple separate <code>Translation</code>, <code>Rotation</code>, and <code>Scale</code> components (which were synced to <code>Transform</code> and <code>GlobalTransform</code>). This made the user-facing API/dataflow simpler, as well as the underlying implementation. The <code>Transform</code> component was backed by a 4x4 matrix. I pressed the big green &quot;merge&quot; button ... happy that we had solved the Transform problem once and for all!</p> +<p>It turns out there was still more work to be done! <a href="https://github.com/bevyengine/bevy/issues/229#issuecomment-698953161">@AThilenius pointed out</a> that using a 4x4 matrix as the source of truth for an affine transform accumulates error over time. Additionally, the Transform API was still a little cumbersome to use. <a href="https://github.com/bevyengine/bevy/issues/229#issuecomment-699172675">At the suggestion of @termhn</a> we decided to investigate using a &quot;similarity&quot; as the source of truth. This had the following benefits:</p> +<ol> +<li>no more error accumulation</li> +<li>we could directly expose translation/rotation/scale fields, which simplified the API significantly</li> +<li>cheaper to store and cheaper to compute hierarchies in some cases</li> +</ol> +<p>We collectively decided this was a good path forward and now we have a re-rewrite that is even better. Yes this is <em>another</em> breaking change, but thats why we label Bevy as being in the &quot;experimentation phase&quot;. Now is the time to break things as often as possible to ensure that we find good apis that will stand the test of time.</p> +<p>This is what the new <code>Transform</code> API looks like in a Bevy ECS system:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">transform</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Mut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> move along the positive x-axis +</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span>translation <span class="z-keyword z-operator z-assignment z-rust">+=</span> <span class="z-meta z-path z-rust">Vec3<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> rotate 180 degrees (pi) around the y-axis +</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span>rotation <span class="z-keyword z-operator z-assignment z-rust">*=</span> <span class="z-meta z-path z-rust">Quat<span class="z-punctuation z-accessor z-rust">::</span></span>from_rotation_y<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-other z-rust">PI</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> scale 2x +</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span>scale <span class="z-keyword z-operator z-assignment z-rust">*=</span> <span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Compared to the last version this is easier to use, more correct, and should also be slightly faster.</p> +<h2 id="gamepad-settings">Gamepad Settings +<a class="anchor-link" href="#gamepad-settings">#</a> +</h2> +<div class="release-feature-authors">authors: @simpuid</div> +<p>The newly added <code>GamepadSettings</code> resource gives developers the ability to customize gamepad settings on a per-controller, per-axis/button basis:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">gamepad_settings</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>GamepadSettings<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + gamepad_settings<span class="z-punctuation z-accessor z-dot z-rust">.</span>axis_settings<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">insert</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span> + GamepadAxis<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Gamepad<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">GamepadAxisType<span class="z-punctuation z-accessor z-rust">::</span></span>LeftStickX</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + AxisSettings <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + positive_high<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">8</span><span class="z-punctuation z-separator z-rust">,</span> + positive_low<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">01</span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="plugin-groups">Plugin Groups +<a class="anchor-link" href="#plugin-groups">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<p>If you've used Bevy, you're probably familiar with this part of <code>App</code> initialization:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_default_plugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This adds the plugins for all of the &quot;core&quot; engine functionality (rendering, input, audio, windowing, etc). It was straightforward, but also very static. What if you don't want to add <em>all</em> of the default plugins? What if you want to create your own custom set of plugins?</p> +<p>To resolve this, we added <code>PluginGroups</code>, which are ordered collections of plugins that can be individually enabled or disabled:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This: +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_default_plugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Has been replaced by this: +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>DefaultPlugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> You can disable specific plugins in a PluginGroup: +</span>app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugins_with</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>DefaultPlugins<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">group</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + group<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">disable<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>RenderPlugin<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">disable<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AudioPlugin<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> And you can create your own PluginGroups: +</span><span class="z-meta z-struct z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">HelloWorldPlugins</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-impl z-rust"><span class="z-storage z-type z-impl z-rust">impl</span> </span><span class="z-meta z-impl z-rust">PluginGroup <span class="z-keyword z-other z-rust">for</span></span><span class="z-meta z-impl z-rust"> <span class="z-entity z-name z-impl z-rust">HelloWorldPlugins</span> </span><span class="z-meta z-impl z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">build</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">self</span>, <span class="z-variable z-parameter z-rust">group</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> PluginGroupBuilder</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + group<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PrintHelloPlugin</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PrintWorldPlugin</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>HelloWorldPlugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="dynamic-window-settings">Dynamic Window Settings +<a class="anchor-link" href="#dynamic-window-settings">#</a> +</h2> +<div class="release-feature-authors">authors: @mockersf</div> +<p>Bevy provides a backend-agnostic windowing API. Up until this point, window settings could only be set once at app startup. If you wanted to set window settings dynamically, you had to directly interact with window backends (ex: winit).</p> +<p>In this release we added the ability to dynamically set window properties at runtime using the Bevy window abstraction:</p> +<pre data-lang="rust" class="language-rust z-code"><code class="language-rust" data-lang="rust"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> This system dynamically sets the window title to the number of seconds since startup. Because why not? +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">change_title</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">windows</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Windows<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> window <span class="z-keyword z-operator z-assignment z-rust">=</span> windows<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_primary_mut</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + window<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set_title</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-support z-macro z-rust">format!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"> + <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Seconds since startup: <span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> time<span class="z-punctuation z-accessor z-dot z-rust">.</span>seconds_since_startup + <span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="documentation-search-ability">Documentation Search-ability +<a class="anchor-link" href="#documentation-search-ability">#</a> +</h2> +<div class="release-feature-authors">authors: @memoryruins</div> +<p>The <code>bevy</code> crate documentation search function now returns results for all sub-crates (like bevy_sprite). Due to how documentation is generated for re-exported crates, by default the <code>bevy</code> search index only covered the &quot;prelude&quot;. @memoryruins found a way to fix this problem by creating new modules and exporting the contents of each crate within those modules (as opposed to aliasing the crates).</p> +<p><img src="https://bevyengine.org/news/bevy-0-3/docs.png" alt="docs" /></p> +<h2 id="change-log">Change Log +<a class="anchor-link" href="#change-log">#</a> +</h2> +<h3 id="added">Added +<a class="anchor-link" href="#added">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/696">Touch Input</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/539">iOS XCode Project</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/740">Android Example and use bevy-glsl-to-spirv 0.2.0</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/679">Introduce Mouse capture API</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/696"><code>bevy_input::touch</code>: implement touch input</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/653">D-pad support on MacOS</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/723">Support for Android file system</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/744">app: PluginGroups and DefaultPlugins</a> +<ul> +<li><code>PluginGroup</code> is a collection of plugins where each plugin can be enabled or disabled.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/683">Support to get gamepad button/trigger values using <code>Axis&lt;GamepadButton&gt;</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/627">Expose Winit decorations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/644">Enable changing window settings at runtime</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/674">Expose a pointer of EventLoopProxy to process custom messages</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/460">Add a way to specify padding/ margins between sprites in a TextureAtlas</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/579">Add <code>bevy_ecs::Commands::remove</code> for bundles</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/675">impl <code>Default</code> for <code>TextureFormat</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/595">Expose current_entity in ChildBuilder</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/671"><code>AppBuilder::add_thread_local_resource</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/661"><code>Commands::write_world_boxed</code> takes a pre-boxed world writer to the ECS's command queue</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/678"><code>FrameTimeDiagnosticsPlugin</code> now shows &quot;frame count&quot; in addition to &quot;frame time&quot; and &quot;fps&quot;</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/565">Add hierarchy example</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/397"><code>WgpuPowerOptions</code> for choosing between low power, high performance, and adaptive power</a></li> +<li>Derive <code>Debug</code> for more types: <a href="https://github.com/bevyengine/bevy/pull/597">#597</a>, <a href="https://github.com/bevyengine/bevy/pull/632">#632</a></li> +<li>Index buffer specialization +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/568">Allows the use of U32 indices in Mesh index buffers in addition to the usual U16 indices</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/572">Switch to u32 indices by default</a></li> +</ul> +</li> +<li>More instructions for system dependencies +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/528">Add <code>systemd-devel</code> for Fedora Linux dependencies</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/538">Add <code>libudev-dev</code> to Ubuntu dependencies</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/645">Add Void Linux to linux dependencies file</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/727">WSL2 instructions</a></li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/552">Suggest <code>-Zrun-dsymutil-no</code> for faster compilation on MacOS</a></li> +</ul> +<h3 id="changed">Changed +<a class="anchor-link" href="#changed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/741">ecs: ergonomic query.iter(), remove locks, add QuerySets</a> +<ul> +<li><code>query.iter()</code> is now a real iterator!</li> +<li><code>QuerySet</code> allows working with conflicting queries and is checked at compile-time.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/752">Rename <code>query.entity()</code> and <code>query.get()</code></a> +<ul> +<li><code>query.get::&lt;Component&gt;(entity)</code> is now <code>query.get_component::&lt;Component&gt;(entity)</code></li> +<li><code>query.entity(entity)</code> is now <code>query.get(entity)</code></li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/693">Asset system rework and GLTF scene loading</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/703">Introduces WASM implementation of <code>AssetIo</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/596">Move transform data out of Mat4</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/700">Separate gamepad state code from gamepad event code and other customizations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/711">gamepad: expose raw and filtered gamepad events</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/689">Do not depend on <code>spirv-reflect</code> on <code>wasm32</code> target</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/544">Move dynamic plugin loading to its own optional crate</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/515">Add field to <code>WindowDescriptor</code> on wasm32 targets to optionally provide an existing canvas element as winit window</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/660">Adjust how <code>ArchetypeAccess</code> tracks mutable &amp; immutable deps</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/535">Use <code>FnOnce</code> in <code>Commands</code> and <code>ChildBuilder</code> where possible</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/690">Runners explicitly call <code>App.initialize()</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/616">sRGB awareness for <code>Color</code></a> +<ul> +<li>Color is now assumed to be provided in the non-linear sRGB colorspace. +Constructors such as <code>Color::rgb</code> and <code>Color::rgba</code> will be converted to linear sRGB.</li> +<li>New methods <code>Color::rgb_linear</code> and <code>Color::rgba_linear</code> will accept colors already in linear sRGB (the old behavior)</li> +<li>Individual color-components must now be accessed through setters and getters.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/599"><code>Mesh</code> overhaul with custom vertex attributes</a> +<ul> +<li>Any vertex attribute can now be added over <code>mesh.attributes.insert()</code>.</li> +<li>See <code>example/shader/mesh_custom_attribute.rs</code></li> +<li>Removed <code>VertexAttribute</code>, <code>Vertex</code>, <code>AsVertexBufferDescriptor</code>.</li> +<li>For missing attributes (requested by shader, but not defined by mesh), Bevy will provide a zero-filled fallback buffer.</li> +</ul> +</li> +<li>Despawning an entity multiple times causes a debug-level log message to be emitted instead of a panic: <a href="https://github.com/bevyengine/bevy/pull/649">#649</a>, <a href="https://github.com/bevyengine/bevy/pull/651">#651</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/692">Migrated to Rodio 0.12</a> +<ul> +<li>New method of playing audio can be found in the examples.</li> +</ul> +</li> +<li>Added support for inserting custom initial values for <code>Local&lt;T&gt;</code> system resources <a href="https://github.com/bevyengine/bevy/pull/745">#745</a></li> +</ul> +<h3 id="fixed">Fixed +<a class="anchor-link" href="#fixed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/560">Properly update bind group ids when setting dynamic bindings</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/610">Properly exit the app on AppExit event</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/618">Fix FloatOrd hash being different for different NaN values</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/543">Fix Added behavior for QueryOne get</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/488">Update camera_system to fix issue with late camera addition</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/664">Register <code>IndexFormat</code> as a property</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/685">Fix breakout example bug</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/713">Fix PreviousParent lag by merging parent update systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/730">Fix bug of connection event of gamepad at startup</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/725">Fix wavy text</a></li> +</ul> +<h2 id="contributors">Contributors +<a class="anchor-link" href="#contributors">#</a> +</h2> +<p>A huge thanks to the <strong>59 contributors</strong> that made this release (and associated docs) possible!</p> +<ul> +<li>alec-deason</li> +<li>alexb910</li> +<li>andrewhickman</li> +<li>blunted2night</li> +<li>Bobox214</li> +<li>cart</li> +<li>CGMossa</li> +<li>CleanCut</li> +<li>ColdIce1605</li> +<li>Cupnfish</li> +<li>Dash-L</li> +<li>DJMcNab</li> +<li>EllenNyan</li> +<li>enfipy</li> +<li>EthanYidong</li> +<li>Gregoor</li> +<li>HyperLightKitsune</li> +<li>ian-h-chamberlain</li> +<li>J-F-Liu</li> +<li>Jerald</li> +<li>jngbsn</li> +<li>joshuajbouw</li> +<li>julhe</li> +<li>kedodrill</li> +<li>lberrymage</li> +<li>lee-orr</li> +<li>liufuyang</li> +<li>MarekLg</li> +<li>Mautar55</li> +<li>memoryruins</li> +<li>mjhostet</li> +<li>mockersf</li> +<li>MrEmanuel</li> +<li>mrk-its</li> +<li>mtsr</li> +<li>naithar</li> +<li>navaati</li> +<li>ndarilek</li> +<li>nic96</li> +<li>ocornoc</li> +<li>Olaren15</li> +<li>PrototypeNM1</li> +<li>Ratysz</li> +<li>Raymond26</li> +<li>robertwayne</li> +<li>simlay</li> +<li>simpuid</li> +<li>smokku</li> +<li>stjepang</li> +<li>SvenTS</li> +<li>sY9sE33</li> +<li>termhn</li> +<li>tigregalis</li> +<li>Vaelint</li> +<li>W4RH4WK</li> +<li>walterpie</li> +<li>will-hart</li> +<li>zgotsch</li> +<li>Zooce</li> +</ul> + + + + Bevy 0.2 + 2020-09-19T00:00:00+00:00 + 2020-09-19T00:00:00+00:00 + + https://bevyengine.org/news/bevy-0-2/ + <p>A month after the initial Bevy release, and thanks to <strong>87</strong> contributors, <strong>174</strong> pull requests, and our <a href="https://github.com/sponsors/cart"><strong>generous sponsors</strong></a>, I'm happy to announce the <strong>Bevy 0.2</strong> release on <a href="https://crates.io/crates/bevy">crates.io</a>!</p> +<p>For those who don't know, Bevy is a refreshingly simple data-driven game engine built in Rust. You can check out <a href="/learn/book/getting-started/">Quick Start Guide</a> to get started. Bevy is also free and open source forever! You can grab the full <a href="https://github.com/bevyengine/bevy">source code</a> on GitHub.</p> +<p>Here are some of the highlights from this release:</p> +<span id="continue-reading"></span><h2 id="async-task-system">Async Task System +<a class="anchor-link" href="#async-task-system">#</a> +</h2> +<div class="release-feature-authors">authors: @lachlansneff and @aclysma</div> +<p>Bevy uses multi-threading throughout the engine: ECS scheduling, asset loading, rendering, etc. Before this release it used <a href="https://github.com/rayon-rs/rayon">Rayon</a> for almost all of these tasks. Rayon is nice because it is generally as simple as calling <code>some_list.par_iter().for_each(|x| do_something(x))</code>. Rayon then automatically breaks the <code>for_each</code> into tasks and runs them on as many cores as it can. Rayon is a great choice if you want to easily parallelize code, but it has the downside of being pretty cpu-hungry.</p> +<p>Bevy (and a number of other rust game engines and ecs frameworks using rayon) have received feedback that they were overly cpu hungry / usage was not proportional to &quot;real&quot; work done.</p> +<p>We decided to resolve this problem by building a custom async-friendly task system, which enables the creation of context-specific task pools. For example, you might have separate pools for compute, IO, networking, etc. This also gives us the flexibility to load balance work appropriately according to work type and/or priority. The cpu usage wins have been huge:</p> +<h3 id="total-combined-percent-cpu-usage-8-core-machine-smaller-is-better">Total Combined Percent CPU Usage - 8 Core Machine (smaller is better) +<a class="anchor-link" href="#total-combined-percent-cpu-usage-8-core-machine-smaller-is-better">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-2/bevy_tasks_1.svg" alt="threading cpu usage 8 core" /></p> +<h3 id="total-combined-percent-cpu-usage-32-core-machine-smaller-is-better">Total Combined Percent CPU Usage - 32 Core Machine (smaller is better) +<a class="anchor-link" href="#total-combined-percent-cpu-usage-32-core-machine-smaller-is-better">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-2/bevy_tasks_2.svg" alt="threading cpu usage 32 core" /></p> +<h2 id="initial-web-platform-support">Initial Web Platform Support +<a class="anchor-link" href="#initial-web-platform-support">#</a> +</h2> +<div class="release-feature-authors">authors: @smokku</div> +<p>(A subset of) Bevy now runs on the web using WebAssembly/WASM! Specifically, Bevy apps can run Bevy ECS schedules, react to input events, create an empty canvas (using winit), and a few other things. This is a huge first step, but it is important to call out that there are still a number of missing pieces, such as 2D/3D rendering, multi-threading, and sound.</p> +<p>Those limitations haven't stopped @mrk-its from building the first WASM Bevy game!</p> +<h3 id="bevy-robbo-playable-here"><a href="https://github.com/mrk-its/bevy-robbo">bevy-robbo</a> (<a href="https://mrk.sed.pl/bevy-robbo/ascii/">playable here</a>) +<a class="anchor-link" href="#bevy-robbo-playable-here">#</a> +</h3> +<p><img src="https://bevyengine.org/news/bevy-0-2/bevy-robbo.png" alt="bevy-robbo" /></p> +<p>They use Bevy for game logic and cleverly work around the render limitations by passing ASCII art game state from <a href="https://github.com/mrk-its/bevy-robbo/blob/ascii/src/systems/js_render.rs">this Bevy system</a> to <a href="https://github.com/mrk-its/bevy-robbo/blob/ascii/wasm/render.js">this JavaScript function</a>.</p> +<p>You can play around with some Bevy WASM examples by <a href="https://github.com/bevyengine/bevy/tree/v0.2.0/examples#wasm">following the instructions here</a>.</p> +<h2 id="parallel-queries">Parallel Queries +<a class="anchor-link" href="#parallel-queries">#</a> +</h2> +<div class="release-feature-authors">authors: @GrantMoyer</div> +<p>Bevy ECS Queries are a flexible way to retrieve data from the Entity Component System. Systems that <em>use</em> queries already run in parallel, but before this change the queries themselves could not be <em>iterated</em> in parallel. <strong>Bevy 0.2</strong> adds the ability to easily iterate queries in parallel:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">pool</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>ComputeTaskPool<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Transform<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">par_iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">32</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">for_each</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>pool<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">transform</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">translate</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Vec3<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>This provides a nice functional API (similar to Rayon) that runs on top of the new <code>bevy_tasks</code> system. It breaks the query up into 32 &quot;batches&quot; and runs each batch as a different task in the bevy task system.</p> +<h2 id="transform-system-rewrite">Transform System Rewrite +<a class="anchor-link" href="#transform-system-rewrite">#</a> +</h2> +<div class="release-feature-authors">authors: @MarekLg</div> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> old +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">translation</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Translation, <span class="z-variable z-parameter z-rust">rotation</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Rotation, <span class="z-variable z-parameter z-rust">scale</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Scale</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span> <span class="z-constant z-other z-placeholder z-rust">{}</span> <span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> translation<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> rotation<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> scale<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> new +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">transform</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Transform</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span><span class="z-constant z-other z-placeholder z-rust">{}</span> <span class="z-constant z-other z-placeholder z-rust">{}</span> <span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">translation</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">rotation</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> transform<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">scale</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Bevy's old transform system used separate <code>Translation</code>, <code>Rotation</code>, and <code>Scale</code> components as the &quot;source of truth&quot;. Users modified with these components in their systems, after which they were synced to a <code>LocalTransform</code> component, which was in turn synced to a global <code>Transform</code> component, taking hierarchy into account. This was nice for a couple of reasons:</p> +<ul> +<li>Slightly more cache efficient to retrieve individual components like <code>Translation</code> (because less data needs to be accessed)</li> +<li>Theoretically more parallel-friendly. Systems that only access <code>Translation</code> won't block systems accessing <code>Rotation</code>.</li> +</ul> +<p>However this approach also has some pretty serious downsides:</p> +<ul> +<li>The &quot;individual components&quot; are the source of truth, so <code>LocalTransform</code> is out of date when user systems are running. If an up to date &quot;full transform&quot; is needed, it must be manually constructed by accessing all three components.</li> +<li>Very hard to reason about. There are 5 components users need to think about and they all interact with each other differently.</li> +<li>Setting a Transform to a specific matrix value (ex: <code>Mat4::look_at()</code>) was extremely cumbersome, and the value would be immediately overwritten unless the user explicitly disabled component syncing.</li> +</ul> +<p>Given these issues, we decided to move to a single unified local-to-parent <code>Transform</code> component as the source of truth, and a computed <code>GlobalTransform</code> component for world-space transforms. We think this API will be much easier to use and to reason about. <a href="https://gist.github.com/joeante/79d25ec3a0e86436e53eb74f3ac82c0c">Unity is also considering a similar Transform rework for their ECS</a> and a lot of discussion on this topic happened in this <a href="https://community.amethyst.rs/t/legion-transform-design-discussion">Amethyst Forum Thread</a>.</p> +<h2 id="joystick-gamepad-input">Joystick/Gamepad Input +<a class="anchor-link" href="#joystick-gamepad-input">#</a> +</h2> +<div class="release-feature-authors">authors: @simpuid</div> +<p>The Bevy Input plugin now has cross-platform support for most controllers thanks to the <a href="https://gitlab.com/gilrs-project/gilrs">gilrs</a> library!</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">button_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">gamepads</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust"><span class="z-support z-type z-rust">Vec</span><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Gamepad<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">button_input</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Input<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>GamepadButton<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> gamepad <span class="z-keyword z-operator z-rust">in</span> gamepads<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> button_input<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">just_pressed</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>GamepadButton<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-arithmetic z-rust">*</span>gamepad<span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">GamepadButtonType<span class="z-punctuation z-accessor z-rust">::</span></span>RightTrigger</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Pressed right trigger!<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="bevy-ecs-performance-improvements">Bevy ECS Performance Improvements +<a class="anchor-link" href="#bevy-ecs-performance-improvements">#</a> +</h2> +<div class="release-feature-authors">authors: @cart</div> +<h3 id="generational-entity-ids">Generational Entity IDs +<a class="anchor-link" href="#generational-entity-ids">#</a> +</h3> +<p>We changed Entity IDs from being random UUIDs to incrementing generational indices. Random UUIDs were nice because they could be created anywhere, were unique across game runs, and could be safely persisted to files or reused across networks. I was really hoping we could make them work, but they ended up being too slow relative to the alternatives. The randomness had a measurable cost and entity locations had to be looked up using a hash map.</p> +<p>By moving to generational indices (we use the hecs implementation), we can directly use entity ids as array indices, which makes entity location lookups lightning fast.</p> +<h3 id="read-only-queries">Read Only Queries +<a class="anchor-link" href="#read-only-queries">#</a> +</h3> +<p>I implemented &quot;read only&quot; traits for queries that don't mutate anything. This allows us to guarantee that a query won't mutate anything.</p> +<h3 id="removed-locking-from-world-apis">Removed locking from World apis +<a class="anchor-link" href="#removed-locking-from-world-apis">#</a> +</h3> +<p>This gives us a really nice speed boost. We can do this safely due to a combination of the new &quot;read only queries&quot; and changing World mutation apis to be a mutable World borrow.</p> +<p>This is not yet enabled for <code>Queries</code> in systems because a system could have multiple <code>Queries</code>, which could be simultaneously accessed in a way that doesn't make mutable access unique. I think thats a solve-able problem, but it will take a bit more work. Fortunately &quot;for-each&quot; systems don't have any collision risk, so we now use lock-less queries there.</p> +<h3 id="direct-component-lookup-in-nanoseconds-smaller-is-better">Direct component lookup (in nanoseconds, smaller is better) +<a class="anchor-link" href="#direct-component-lookup-in-nanoseconds-smaller-is-better">#</a> +</h3> +<p>As a result of these optimizations, direct component lookup is <em>much</em> faster than it used to be:</p> +<p><img src="https://bevyengine.org/news/bevy-0-2/get_component.svg" alt="get_component graph" /></p> +<p>Note that this benchmark used <code>world.get::&lt;T&gt;(entity)</code>. <code>query.get::&lt;T&gt;(entity)</code> should have results similar to the <code>hecs</code> results because it still uses a lock. Eventually I'm hoping that we can remove locks from system queries too.</p> +<h2 id="change-log">Change Log +<a class="anchor-link" href="#change-log">#</a> +</h2> +<h3 id="added">Added +<a class="anchor-link" href="#added">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/384">Task System for Bevy</a> +<ul> +<li>Replaces rayon with a custom designed task system that consists of several &quot;TaskPools&quot;.</li> +<li>Exports <code>IOTaskPool</code>, <code>ComputePool</code>, and <code>AsyncComputePool</code> in <code>bevy_tasks</code> crate.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/292">Parallel queries for distributing work over with the <code>ParallelIterator</code> trait.</a> +<ul> +<li>e.g. <code>query.iter().par_iter(batch_size).for_each(/* ... */)</code></li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/280">Added gamepad support using Gilrs</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/503">Implement WASM support for bevy_winit</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/506">Create winit canvas under WebAssembly</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/496">Implement single threaded task scheduler for WebAssembly</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/271">Support for binary glTF (.glb).</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/358">Support for <code>Or</code> in ECS queries.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/339">Added methods <code>unload()</code> and <code>unload_sync()</code> on <code>SceneSpawner</code> for unloading scenes.</a>.</li> +<li><a href="https://github.com/bevyengine/bevy/pull/145">Custom rodio source for audio.</a> +<ul> +<li><code>AudioOuput</code> is now able to play anything <code>Decodable</code>.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/362"><code>Color::hex</code></a> for creating <code>Color</code> from string hex values. +<ul> +<li>Accepts the forms RGB, RGBA, RRGGBB, and RRGGBBAA.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/381"><code>Color::rgb_u8</code> and <code>Color::rgba_u8</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/396">Added <code>bevy_render::pass::ClearColor</code> to prelude.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/430"><code>SpriteResizeMode</code> may choose how <code>Sprite</code> resizing should be handled. <code>Automatic</code> by default.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/428">Added methods on <code>Input&lt;T&gt;</code></a> for iterator access to keys. +<ul> +<li><code>get_pressed()</code>, <code>get_just_pressed()</code>, <code>get_just_released()</code></li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/270">Derived <code>Copy</code> for <code>MouseScrollUnit</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/390">Derived <code>Clone</code> for UI component bundles.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/332">Some examples of documentation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/451">Update docs for Updated, Changed and Mutated</a></li> +<li>Tips for faster builds on macOS: <a href="https://github.com/bevyengine/bevy/pull/312">#312</a>, <a href="https://github.com/bevyengine/bevy/pull/314">#314</a>, <a href="https://github.com/bevyengine/bevy/pull/433">#433</a></li> +<li>Added and documented cargo features +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/249">Created document <code>docs/cargo_features.md</code>.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/249">Added features for x11 and wayland display servers.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/363">and added a feature to disable libloading.</a> (helpful for WASM support)</li> +</ul> +</li> +<li>Added more instructions for Linux dependencies +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/275">Arch / Manjaro</a>, <a href="https://github.com/bevyengine/bevy/pull/290">NixOS</a>, <a href="https://github.com/bevyengine/bevy/pull/463">Ubuntu</a> and <a href="https://github.com/bevyengine/bevy/pull/331">Solus</a></li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/491">Provide shell.nix for easier compiling with nix-shell</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/505">Add <code>AppBuilder::add_startup_stage_|before/after</code></a></li> +</ul> +<h3 id="changed">Changed +<a class="anchor-link" href="#changed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/374">Transform rewrite</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/504">Use generational entity ids and other optimizations</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/417">Optimize transform systems to only run on changes.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/323">Send an AssetEvent when modifying using <code>get_id_mut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/332">Rename <code>Assets::get_id_mut</code> -&gt; <code>Assets::get_with_id_mut</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/183">Support multiline text in <code>DrawableText</code></a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/324">iOS: use shaderc-rs for glsl to spirv compilation</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/304">Changed the default node size to Auto instead of Undefined to match the Stretch implementation.</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/478">Load assets from root path when loading directly</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/485">Add <code>render</code> feature</a>, which makes the entire render pipeline optional.</li> +</ul> +<h3 id="fixed">Fixed +<a class="anchor-link" href="#fixed">#</a> +</h3> +<ul> +<li><a href="https://github.com/bevyengine/bevy/pull/361">Properly track added and removed RenderResources in RenderResourcesNode.</a> +<ul> +<li>Fixes issues where entities vanished or changed color when new entities were spawned/despawned.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/385">Fixed sprite clipping at same depth</a> +<ul> +<li>Transparent sprites should no longer clip.</li> +</ul> +</li> +<li><a href="https://github.com/bevyengine/bevy/pull/345">Check asset path existence</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/376">Fixed deadlock in hot asset reloading</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/394">Fixed hot asset reloading on Windows</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/406">Allow glTFs to be loaded that don't have uvs and normals</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/383">Fixed archetypes_generation being incorrectly updated for systems</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/386">Remove child from parent when it is despawned</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/444">Initialize App.schedule systems when running the app</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/486">Fix missing asset info path for synchronous loading</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/495">fix font atlas overflow</a></li> +<li><a href="https://github.com/bevyengine/bevy/pull/490">do not assume font handle is present in assets</a></li> +</ul> +<h3 id="internal-improvements">Internal Improvements +<a class="anchor-link" href="#internal-improvements">#</a> +</h3> +<ul> +<li>Many improvements to Bevy's CI <a href="https://github.com/bevyengine/bevy/pull/325">#325</a>, <a href="https://github.com/bevyengine/bevy/pull/349">#349</a>, <a href="https://github.com/bevyengine/bevy/pull/357">#357</a>, <a href="https://github.com/bevyengine/bevy/pull/373">#373</a>, <a href="https://github.com/bevyengine/bevy/pull/423">#423</a></li> +</ul> +<h2 id="contributors">Contributors +<a class="anchor-link" href="#contributors">#</a> +</h2> +<p>A huge thanks to the <strong>87 contributors</strong> that made this release (and associated docs) possible!</p> +<ul> +<li>0x22fe</li> +<li>8bit-pudding</li> +<li>aarongeorge</li> +<li>ablakey</li> +<li>aclysma</li> +<li>adekau</li> +<li>aevyrie</li> +<li>AmionSky</li> +<li>andreheringer</li> +<li>AngelOnFira</li> +<li>ashneverdawn</li> +<li>BafDyce</li> +<li>BimDav</li> +<li>bitshifter</li> +<li>Bobox214</li> +<li>Boiethios</li> +<li>caelunshun</li> +<li>cart</li> +<li>CleanCut</li> +<li>dallenng</li> +<li>DGriffin91</li> +<li>Dispersia</li> +<li>DJMcNab</li> +<li>eliaspekkala</li> +<li>EllenNyan</li> +<li>eXodiquas</li> +<li>figsoda</li> +<li>Fishrock123</li> +<li>FSMaxB</li> +<li>GabLotus</li> +<li>GrantMoyer</li> +<li>guimcaballero</li> +<li>Halfwhit</li> +<li>hannobraun</li> +<li>IceSentry</li> +<li>ifletsomeclaire</li> +<li>Incipium</li> +<li>io12</li> +<li>jakerr</li> +<li>jamadazi</li> +<li>joejoepie</li> +<li>JohnDoneth</li> +<li>julhe</li> +<li>kaflu</li> +<li>karroffel</li> +<li>lachlansneff</li> +<li>lberrymage</li> +<li>logannc</li> +<li>Lowentwickler</li> +<li>MarekLg</li> +<li>MatteoGgl</li> +<li>memoryruins</li> +<li>mfrancis107</li> +<li>MGlolenstine</li> +<li>MichaelHills</li> +<li>MilanVasko</li> +<li>Moxinilian</li> +<li>mrk-its</li> +<li>mtsr</li> +<li>multun</li> +<li>naithar</li> +<li>ncallaway</li> +<li>ndarilek</li> +<li>OptimisticPeach</li> +<li>PrototypeNM1</li> +<li>reidbhuntley</li> +<li>RobDavenport</li> +<li>saicu</li> +<li>simpuid</li> +<li>SmiteWindows</li> +<li>smokku</li> +<li>StarArawn</li> +<li>stefee</li> +<li>tarkah</li> +<li>TehPers</li> +<li>Telzhaak</li> +<li>TheNeikos</li> +<li>thirdsgames</li> +<li>TomBebb</li> +<li>tristanpemble</li> +<li>verzuz</li> +<li>VitalyAnkh</li> +<li>w1th0utnam3</li> +<li>Waridley</li> +<li>wyhaya</li> +<li>Xavientois</li> +<li>zicklag</li> +</ul> + + + + Scaling Bevy + 2020-08-19T00:00:00+00:00 + 2020-08-19T00:00:00+00:00 + + https://bevyengine.org/news/scaling-bevy/ + <p>First, I want to take a moment to highlight just how wild the last week has been. <a href="/news/introducing-bevy"><strong>Bevy was only released a week ago</strong></a> and we've already hit some pretty major milestones:</p> +<span id="continue-reading"></span><div style="display: flex; flex-wrap: wrap; width: 100%"> + <div style="max-width: 30rem; max-height: 15rem; margin-right: 3rem; margin-bottom: 3rem"> + <h4> 3rd most popular /r/rust post <i>of all time</i></h4> + <img src="3rd_on_reddit.png" style="display: block; height: 13rem"/> + </div> + <div style="max-width: 30rem; max-height: 15rem; margin-right: 3rem; margin-bottom: 3rem"> + <h4>#2 on Hacker News</h4> + <img src="2nd_on_hacker_news.png" style="display: block; height: 10rem"/> + </div> + <div style="max-width: 20rem; max-height: 15rem; margin-right: 3rem; margin-bottom: 3rem"> + <h4>2,200 Github Stars</h4> + <img src="2_2k_stars.png" style="display: block; height: 3rem"/> + </div> + <div style="max-width: 20rem; max-height: 15rem; margin-right: 3rem; margin-bottom: 3rem"> + <h4>26 contributors</h4> + <img src="contributors.png" style="display: block; height: 8rem"/> + </div> + <div style="max-width: 20rem; max-height: 15rem; margin-right: 3rem; margin-bottom: 3rem"> + <h4>644 Discord Users</h4> + <img src="discord_users.png" style="display: block; height: 6rem"/> + </div> + <div style="max-width: 21rem; max-height: 15rem; margin-right: 3rem; margin-bottom: 3rem"> + <h4 style="text-align: center"><a href="https://github.com/sponsors/cart">37% of the way to making my full time Bevy development sustainable</a></h4> + <a href="https://github.com/sponsors/cart"><img src="funding.png" style="display: block; height: 6rem"/></a> + </div> + <div style="max-width: 35rem; margin-right: 3rem; margin-bottom: 3rem"> + <h3 style="text-align: center;"><a href="https://github.com/bevyengine/awesome-bevy">A truly awesome number of community-developed plugins, games, and apps</a></h3> + <a href="https://github.com/bevyengine/awesome-bevy"><img src="awesome.png" style="display: block; height: 20rem"/></a> + </div> +</div> +<h2 id="how-can-bevy-operate-at-this-scale">How can Bevy operate at this scale? +<a class="anchor-link" href="#how-can-bevy-operate-at-this-scale">#</a> +</h2> +<p>I didn't in my wildest dreams anticipate a community to show up so quickly and in such force. Clearly the Bevy project resonates with people! This is wonderful, but it also presents some interesting challenges that I thought I would have a lot more time to solve:</p> +<ul> +<li><strong>I am a bottleneck</strong>: Right now I am the only one with the right to merge code. This can't change until people get ramped up and trust is built.</li> +<li><strong>Everyone is fresh</strong>: Everyone is new to the codebase, so changes require a lot of scrutiny, and developers need a lot of guidance.</li> +<li><strong>No structure</strong>: We don't have an organization or a well-defined development process.</li> +</ul> +<p>Before we try to solve these problems, I think we need to ask ourselves:</p> +<h3 id="what-made-bevy-good">What made Bevy &quot;good&quot;? +<a class="anchor-link" href="#what-made-bevy-good">#</a> +</h3> +<p>I think this is actually a relatively straightforward answer. I think it boils down to:</p> +<ol> +<li><strong>Learn from the best</strong>: I thoroughly reviewed at all of the existing options, learned all I could from them, and either built something new based on those learnings or made iterative improvements</li> +<li><strong>Freedom to experiment</strong>: I was unencumbered by stability guarantees, pressure to make the &quot;right&quot; call every time, or deadlines</li> +<li><strong>Focus</strong>: I was able to work on Bevy full time with zero distractions for ~5 months</li> +</ol> +<p>How can we replicate this process at the new scale of the Bevy community? And how can I personally replicate this now that my job title has changed from &quot;solo incognito moonshot project architect&quot; to &quot;lead architect&quot; / &quot;project manager&quot; / &quot;community manager&quot; of a project with a developer community numbering in the thousands?</p> +<h2 id="the-plan">The Plan +<a class="anchor-link" href="#the-plan">#</a> +</h2> +<p>I don't think now is the time to get bogged down in complex organizational structures or RFC processes. Eventually we will need those tools, but I don't think we're there yet. Instead I'm going to try to re-create the conditions I've been operating under for the last five months:</p> +<h3 id="bdfalaicmi">BDFALAICMI +<a class="anchor-link" href="#bdfalaicmi">#</a> +</h3> +<p>I plan on being a <strong>B</strong>enevolent <strong>D</strong>ictator <strong>F</strong>or <strong>A</strong>s <strong>L</strong>ong <strong>A</strong>s <strong>I</strong> <strong>C</strong>an <strong>M</strong>anage <strong>I</strong>t. I will personally review every PR that gets merged and every design decision made. Eventually (if we do this right) that will become impossible, but we aren’t there yet. As I build trust in contributors and the project expands I will eventually start delegating. But I will always bias toward “small and focused”. My general skill-set and preference is to be a full time software developer / architect, but I have accepted that I need to balance that with being a project and community manager. My short term goal will be to drive down our massive Issue and PR backlog :)</p> +<h3 id="focus-focus-focus">Focus Focus Focus +<a class="anchor-link" href="#focus-focus-focus">#</a> +</h3> +<p><a href="https://github.com/bevyengine/bevy/projects/1">We have a long road ahead of us</a>. Building an engine is a lot like leveling up a skill tree in a game. Some features can't (or shouldn't) be built until we have built their predecessors. An example of this is the Bevy Editor. Before we break ground on the editor, we need to make sure Bevy UI and Bevy Scenes are in a good spot. I am just one person. I have limited bandwidth to build designs and review proposals, so I can't afford to waste energy on the editor yet.</p> +<p>At a given point in time, Bevy will have 3 <a href="https://github.com/bevyengine/bevy/labels/focus-area">focus areas</a>. These areas will receive priority for my time, and I will try my best to direct contributors to those areas. This doesn't mean others aren't free to explore other areas they are interested in. Just don't expect to get them merged quickly. Ideally you're building a standalone plugin that doesn't require being directly merged into the Bevy repo anyway.</p> +<h3 id="fast-and-loose">Fast and Loose +<a class="anchor-link" href="#fast-and-loose">#</a> +</h3> +<p>I don't want to get stuck in &quot;design hell&quot;. We can debate the best way to build a PBR renderer for years. But without implementations and hard data, it is very hard to determine what is <em>actually best in practice</em>. <em>I want to see code</em>. Production-readiness is a non-feature. A good idea is nice, but if there is no implementation it isn't real to me. We need capable people to take good ideas and make them real. The faster we can try different approaches, the better. For now the general process will be:</p> +<ol> +<li>Identify a focus area and communicate the general direction Bevy should be taking in this area</li> +<li>Encourage contributors to create their own &quot;prototype&quot; crates. In some cases I will create my own. The Bevy project will provide a centralized list of these crates, which will facilitate discover-ability and help consolidate efforts. If you make a crate, please use the <code>bevy_prototype_XXX</code> format for crate names to respect the <code>bevy_XXX</code> namespace. This approach will allow us to &quot;scale out&quot; without too much process or centralization.</li> +<li>Once we have working prototypes we can start to try building consensus. We can afford to take our time here. The prototype features will already be out there for the people that want them. The cost of merging something too early is high. Merging something is a signal that we have picked a path and are <em>committed to it</em>. At that point experimentation becomes costly and painful for Bevy crate consumers. For now I will have the final say on what gets merged and when it happens. It will be the job of the community to convince me to take a given path, but I promise I'm reasonable! And I will defer to subject matter experts when it makes sense.</li> +</ol> +<h3 id="collaborate">Collaborate +<a class="anchor-link" href="#collaborate">#</a> +</h3> +<p>Bevy has caught the attention of many popular Rust projects. <a href="https://community.amethyst.rs/t/bevy-engine-addressing-the-elephant-in-the-room">We are currently discussing the best way to collaborate with Amethyst Engine</a>. I'm also talking to a number of other Rust project leads about the best way to make Bevy a good ecosystem player. As much as possible we should be building up common foundations. Please reach out to me (Twitter DMs or on Discord) if you know of potential collaboration areas.</p> +<h2 id="bevy-s-current-focus-areas">Bevy's Current Focus Areas +<a class="anchor-link" href="#bevy-s-current-focus-areas">#</a> +</h2> +<p>Here are Bevy's current focus areas. I will direct my attention and attempt to direct everyone elses' attention to them. There are no deadlines. We will take as long as we need to get them right. I will work as hard as I can (full-time) to ensure we make quick progress on them:</p> +<h3 id="editor-ready-ui"><a href="https://github.com/bevyengine/bevy/issues/254">Editor-Ready UI</a> +<a class="anchor-link" href="#editor-ready-ui">#</a> +</h3> +<p>Before we can start work on the Bevy Editor, we need a solid UI implementation. Bevy UI already has nice &quot;flexbox&quot; layout, and we already have a first stab at buttons and interaction events. But Bevy UI still needs a lot more experimentation if we're going to find the &quot;right&quot; patterns and paradigms. <strong>Editor-Ready UI</strong> has the following requirements:</p> +<ul> +<li>Embraces the Bevy architecture: Bevy ECS, Bevy Scenes, Bevy Assets, Bevy Events</li> +<li>A Canvas-style API for drawing widgets with shapes and anti-aliased curves</li> +<li>Define a consistent way to implement widgets</li> +<li>A core set of widgets: buttons, inputs, resizable panels, etc</li> +<li>Theme-ability</li> +<li>&quot;Interaction&quot; and &quot;focus&quot; events</li> +<li>Translation-friendly. We can't be anglo-centric here</li> +</ul> +<p>Suggesting other UI frameworks or stacks is out of scope. The Bevy Editor <em>will be</em> built on top of Bevy UI. See the <a href="https://bevyengine.org/news/introducing-bevy/">Introducing Bevy</a> blog post for my rationale.</p> +<h3 id="physically-based-rendering-pbr"><a href="https://github.com/bevyengine/bevy/issues/179">Physically Based Rendering (PBR)</a> +<a class="anchor-link" href="#physically-based-rendering-pbr">#</a> +</h3> +<p>PBR is a standard-ish way of rendering realistically in 3D. There is both a lot of interest and a lot of brain-power in this area, so it makes sense to build PBR now. This focus area has the following (minimum) requirements:</p> +<ul> +<li>PBR Shaders (which implies hdr)</li> +<li>Bloom (to convey hdr)</li> +<li>Shadowing (forces us to build out a real &quot;pipeline&quot;)</li> +<li>Battle-test the current mid-level rendering abstractions and rework them where necessary</li> +</ul> +<h3 id="scenes"><a href="https://github.com/bevyengine/bevy/issues/255">Scenes</a> +<a class="anchor-link" href="#scenes">#</a> +</h3> +<p>Bevy Scenes currently do most of what we want, but they need a bit more work before they can be the foundation of Bevy state management. This focus area is also a requirement for the Bevy Editor.</p> +<ul> +<li><strong>Asset Management:</strong> Inline assets, asset dependencies, stable ids when loaded from the disk</li> +<li><strong>Better Scene Format:</strong> Improve the legibility and ergonomics of scene files to make them easy to read and easy to compose by hand. We're shooting for something <a href="https://gist.github.com/cart/3e77d6537e1a0979a69de5c6749b6bcb">close to this</a>.</li> +<li><strong>Enabling/Disabling Systems:</strong> Scenes should be able to toggle their required systems on and off when they are added / removed</li> +</ul> +<h2 id="want-to-help">Want to help? +<a class="anchor-link" href="#want-to-help">#</a> +</h2> +<p>If you want to hop on this wild ride with us, here are a few ways you can help:</p> +<ol> +<li><strong>Contribute To Prototype Plugins</strong>: Start building new prototype Bevy plugins and contribute to the one's others are working on. Ideally in the focus areas above. At this point we are looking for fast prototypes that demonstrate new ideas. If you want to get started on a project within a given focus area: +<ul> +<li>Read through the corresponding <a href="https://github.com/bevyengine/bevy/labels/focus-area">focus-area</a> issue on GitHub</li> +<li>Look for current projects in that issue and find potential collaboration areas.</li> +<li>If you can't find an existing project and you want to start one, set up a new crate/repo and link to it in the &quot;focus-area&quot; issue. We will maintain an index of active projects at the top of the thread. We will also encourage collaboration when it looks like there are overly-redundant efforts.</li> +</ul> +</li> +<li><strong>Assist the Bevy Community</strong>: If you are able, help us resolve issues on the <a href="https://github.com/bevyengine/bevy/issues">Bevy Issue Tracker</a>, review <a href="https://github.com/bevyengine/bevy/pulls">pull requests</a>, and provide help on the <a href="https://discord.com/channels/691052431525675048/742884593551802431">#help channel of our Discord</a>. It is a real challenge to keep up with the sheer volume of work here, so any help is <em>very very</em> appreciated.</li> +<li><strong>Help Me Make Full Time Development Sustainable</strong>: I need your help to make Bevy development sustainable! Five months ago I quit my comfortable Senior Software Engineer job at Microsoft to work on Bevy full time. I am currently paying my rent and living expenses out of pocket. I can't sustain this for long, as much as I want to. <a href="https://github.com/sponsors/cart">We're already 37% of the way to sustainable development</a> and it has only been two days!</li> +</ol> +<p>I'm looking forward to seeing you in the <a href="/community">Bevy Community</a>!</p> + + + + Introducing Bevy 0.1 + 2020-08-10T00:00:00+00:00 + 2020-08-10T00:00:00+00:00 + + https://bevyengine.org/news/introducing-bevy/ + <p><video controls loop><source src="hot_reloading.mp4" type="video/mp4"/></video></p> +<p>After months of work, I am ecstatic to finally announce <strong>Bevy Engine</strong>!</p> +<p>Bevy is a refreshingly simple data-driven game engine and app framework built in Rust. It is <a href="https://github.com/bevyengine/bevy">free and open-source</a> forever!</p> +<span id="continue-reading"></span> +<p>It has the following design goals:</p> +<ul> +<li><b class="fun-list">Capable</b>: Offer a complete 2D and 3D feature set</li> +<li><b class="fun-list">Simple</b>: Easy for newbies to pick up, but infinitely flexible for power users</li> +<li><b class="fun-list">Data Focused</b>: Data-oriented architecture using the Entity Component System paradigm</li> +<li><b class="fun-list">Modular</b>: Use only what you need. Replace what you don't like</li> +<li><b class="fun-list">Fast</b>: App logic should run quickly, and when possible, in parallel</li> +<li><b class="fun-list">Productive</b>: Changes should compile quickly ... waiting isn't fun</li> +</ul> +<p>Bevy has a number of features that I think set it apart from other engines:</p> +<ul> +<li><b class="fun-list">Bevy ECS</b>: A custom Entity Component System with unrivaled usability and blisteringly-fast performance</li> +<li><b class="fun-list">Render Graphs</b>: Easily build your own multi-threaded render pipelines using Render Graph nodes</li> +<li><b class="fun-list">Bevy UI</b>: A custom ECS-driven UI framework built specifically for Bevy</li> +<li><b class="fun-list">Productive Compile Times</b>: Expect changes to compile in ~0.8-3.0 seconds with the &quot;fast compiles&quot; config</li> +</ul> +<p>It also has many features most people expect from a modern, general purpose engine:</p> +<ul> +<li><b class="fun-list">Cross Platform</b>: Windows, MacOS, and Linux (with planned support for mobile and web)</li> +<li><b class="fun-list">3D</b>: Lights, meshes, textures, MSAA, and GLTF loading</li> +<li><b class="fun-list">Sprites</b>: Render individual images as sprites, render from sprite sheets, and dynamically generate new sprite sheets</li> +<li><b class="fun-list">Assets</b>: An extensible, event driven asset system that loads assets asynchronously in background threads</li> +<li><b class="fun-list">Scenes</b>: Save ECS Worlds to human-readable scene files and load scene files into ECS Worlds</li> +<li><b class="fun-list">Plugins</b>: All engine and app features are implemented as modular plugins</li> +<li><b class="fun-list">Sound</b>: Load audio files as assets and play them from within systems</li> +<li><b class="fun-list">Multiple Render Backends</b>: Vulkan, DirectX 12, and Metal (with more on the way thanks to <a href="https://github.com/gfx-rs/wgpu">wgpu</a>)</li> +<li><b class="fun-list">Data Driven Shaders</b>: Easily bind ECS components directly to shader uniforms</li> +<li><b class="fun-list">Hot Asset Reloading</b>: Automatically reload changes to assets at runtime without recompiles or restarts</li> +<li><b class="fun-list">Events</b>: Efficiently consume and produce Events from within ECS systems</li> +<li><b class="fun-list">Properties</b>: Dynamically get and set component fields using a string version of their names</li> +<li><b class="fun-list">Hierarchical Transforms</b>: Create parent-child relationships between entities that propagate Transforms down the hierarchy</li> +</ul> +<p>That being said, Bevy is still in the very early stages. I consider it to be in the &quot;prototyping&quot; phase: features are missing, APIs will change, and documentation is sparse. <span class="warning">I don't yet recommend using Bevy in serious projects unless you are willing to deal with gaps and instability</span>.</p> +<p>Hopefully at this point you are either (1) jazzed about Bevy or (2) not reading anymore. If you want to dive in right now, <a href="https://bevyengine.org/learn/book/introduction/">The Bevy Book</a> is the best place to get started. You can also keep reading to find out what the current state of Bevy is and where we'd like to take it.</p> +<p><strong>Quick note to the reader</strong>: in this article you will find text formatted like this: + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_render&#x2F;0.1.0&#x2F;bevy_render&#x2F;texture/struct.Texture.html"><code>Texture</code></a></p> +<p>This formatting indicates that the text is a Rust type that links to API documentation. I encourage you to click on anything that seems interesting to you!</p> +<h2 id="bevy-apps">Bevy Apps +<a class="anchor-link" href="#bevy-apps">#</a> +</h2> +<p>First, lets see what a Bevy App actually looks like. The simplest App looks like this:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-keyword z-other z-rust">use</span> <span class="z-meta z-path z-rust">bevy<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">prelude<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-keyword z-operator z-arithmetic z-rust">*</span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Thats it! This App pulls in no features and literally does nothing. Running the program would just immediately terminate. We can make it a little more interesting by doing this:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_default_plugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p> + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy&#x2F;0.1.0&#x2F;bevy/trait.AddDefaultPlugins.html#method.add_default_plugins"><code>add_default_plugins()</code></a> adds all of the features you probably expect from a game engine: a 2D / 3D renderer, asset loading, a UI system, windows, input, etc</p> +<p>You can also register the default + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_app&#x2F;0.1.0&#x2F;bevy_app/trait.Plugin.html"><code>Plugin</code></a>s manually like this:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugin</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">CorePlugin<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugin</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">InputPlugin<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugin</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">WindowPlugin<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugin</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">RenderPlugin<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_plugin</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">UiPlugin<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> more plugins here ... omitted for brevity <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>And of course you can also create your own plugins. In fact, all engine and game logic is built using plugins. Hopefully now you understand what we mean by modular: you are free to add/remove plugins based on your project's unique needs. However I expect that most people will stick to + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy&#x2F;0.1.0&#x2F;bevy/trait.AddDefaultPlugins.html#method.add_default_plugins"><code>add_default_plugins()</code></a> for simplicity, at least initially.</p> +<h2 id="bevy-ecs">Bevy ECS +<a class="anchor-link" href="#bevy-ecs">#</a> +</h2> +<p>All Bevy engine and game logic is built on top of a custom <a href="https://en.wikipedia.org/wiki/Entity_component_system">Entity Component System</a> (or ECS for short). Entity Component Systems are a software paradigm that involves breaking data up into Components. Entities are unique ids assigned to groups of Components. For example, one entity might might have a <code>Position</code> and <code>Velocity</code> component, whereas another entity might have a <code>Position</code> and <code>UI</code> component. Systems are logic that runs on a specific set of component types. You might have a <code>movement</code> system that runs on all entities with a <code>Position</code> and <code>Velocity</code> component.</p> +<p>The ECS pattern encourages clean, decoupled designs by forcing you to break up your app data and logic into its core components.</p> +<p>Unlike other Rust ECS implementations, which require complex lifetimes, traits, builder patterns, or macros, Bevy ECS uses normal Rust datatypes for all of these concepts:</p> +<ul> +<li><b class="fun-list">Components</b>: normal Rust structs</li> +<li><b class="fun-list">Systems</b>: normal Rust functions</li> +<li><b class="fun-list">Entities</b>: a type containing a unique integer</li> +</ul> +<p>There are already plenty of <a href="https://www.youtube.com/watch?v=2rW7ALyHaas">great introductions</a> to the ECS paradigm, so I'll leave &quot;getting up to speed on ECS&quot; as an exercise for the reader and skip right to what makes Bevy's ECS so special:</p> +<h3 id="ergonomics">Ergonomics +<a class="anchor-link" href="#ergonomics">#</a> +</h3> +<p>I'm going to make a wild (and unverifiable) claim here: Bevy ECS is the most ergonomic ECS <em>in existence</em>:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-keyword z-other z-rust">use</span> <span class="z-meta z-path z-rust">bevy<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">prelude<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-keyword z-operator z-arithmetic z-rust">*</span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Velocity</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">f32</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Position</span></span><span class="z-meta z-struct z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-storage z-type z-rust">f32</span></span><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this system spawns entities with the Position and Velocity components +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">setup</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Position<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> Velocity<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Position<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> Velocity<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this system runs on each entity with a Position and Velocity component +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">movement</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">position</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Mut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Position<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">velocity</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Velocity</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + position<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span> <span class="z-keyword z-operator z-assignment z-rust">+=</span> velocity<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> the app entry point. hopefully you recognize it from the examples above! +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_default_plugins</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_startup_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>setup<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>That is a complete self-contained Bevy app with automatic parallel system scheduling and global change detection. In my opinion, you <a href="https://github.com/amethyst/specs/blob/master/examples/basic.rs">won't</a> find <a href="https://github.com/TomGillen/legion">any</a> ECS <a href="https://github.com/leudz/shipyard/blob/master/bunny_demo/src/systems.rs">with</a> better <a href="https://github.com/Unity-Technologies/EntityComponentSystemSamples/tree/master/ECSSamples/Assets/HelloCube">clarity</a> or ergonomics. Building games (and engines) involves writing a large number of systems, so I heavily invested in making ECS code easy to write <em>and</em> easy to read.</p> +<h3 id="performance">Performance +<a class="anchor-link" href="#performance">#</a> +</h3> +<p>One of the reasons the ECS paradigm is so popular is that it has the potential to make game logic <em>super</em> fast, primarily for these two reasons:</p> +<ol> +<li><b class="fun-list">Iteration Speed</b>: Components are packed tightly together to optimize for cache-locality, which makes iterating over them blazing fast</li> +<li><b class="fun-list">Parallelism</b>: Systems declare read/write dependencies, which enables automatic and efficient lock-free parallel scheduling</li> +</ol> +<p>Bevy ECS does both of these things about as well as it can. According to the popular <code>ecs_bench</code> benchmark, Bevy ECS is the fastest Rust ECS by a pretty wide margin:</p> +<h4 id="system-iteration-in-nanoseconds-less-is-better">System Iteration (in nanoseconds, less is better) +<a class="anchor-link" href="#system-iteration-in-nanoseconds-less-is-better">#</a> +</h4> +<p><img src="https://bevyengine.org/news/introducing-bevy/ecs_iter.svg" alt="ecs iter performance graph" /></p> +<h4 id="world-setup-in-nanoseconds-less-is-better">World Setup (in nanoseconds, less is better) +<a class="anchor-link" href="#world-setup-in-nanoseconds-less-is-better">#</a> +</h4> +<p><img src="https://bevyengine.org/news/introducing-bevy/ecs_build.svg" alt="ecs iter performance graph" /></p> +<p>Note that <code>ecs_bench</code> is a single threaded benchmark, so it doesn't illustrate the multi-threading capabilities of these framework. And as always, please be aware that <code>ecs_bench</code> is a micro benchmark and it doesn't illustrate the performance of a complex game. There is a lot of nuance in the ECS performance space and each of the ECS implementations above will perform differently under different workloads.</p> +<p>I have pushed my version of <code>ecs_bench</code> <a href="https://github.com/cart/ecs_bench">here</a> if anyone wants to double-check my methodology. For some reasonable amount of time I will post updates here if anyone reports a problem or my results are not (on average) reproducible.</p> +<h3 id="features">Features +<a class="anchor-link" href="#features">#</a> +</h3> +<p>Now you might be thinking &quot;Ok @cart, so Bevy ECS has great performance and ergonomics, but <em>surely</em> this means you had to compromise on features!&quot;</p> +<p>... <strong>NOPE</strong> Bevy has you covered:</p> +<h4 id="for-each-systems">For Each Systems +<a class="anchor-link" href="#for-each-systems">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> &quot;for each systems&quot; run once on each entity containing the given components +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">position</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Mut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Position<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">velocity</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Velocity</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="query-systems">Query Systems +<a class="anchor-link" href="#query-systems">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this &quot;query system&quot; is the same as the system above, but gives you control over iteration +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-rust">&amp;</span>Position, <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Velocity<span class="z-punctuation z-section z-group z-end z-rust">)</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> <span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>position<span class="z-punctuation z-separator z-rust">,</span> <span class="z-storage z-modifier z-rust">mut</span> velocity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="change-detection">Change Detection +<a class="anchor-link" href="#change-detection">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Added&lt;T&gt; queries only run when the given component has been added +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Added<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Position<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> position <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Mutated&lt;T&gt; queries only run when the given component has been mutated +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Mutated<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Position<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> position <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Changed&lt;T&gt; queries only run when the given component has been added or mutated +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Changed<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Position<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> position <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> query.removed&lt;T&gt;() will iterate over every entity where the component T was removed this update +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Position<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>&gt;</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> entity <span class="z-keyword z-operator z-rust">in</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">removed<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Velocity<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="multiple-queries">Multiple Queries +<a class="anchor-link" href="#multiple-queries">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">wall_query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Wall<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">player_query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> player <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> player_query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> wall <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> wall_query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> player<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">collides_with</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>wall</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>ouch<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="entity-queries-and-direct-component-access">Entity Queries and Direct Component Access +<a class="anchor-link" href="#entity-queries-and-direct-component-access">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">entity_query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Entity<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">player_query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> entity <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> entity_query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>player</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> player_query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">get<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Player<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>entity</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> the current entity has a player component +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="resources">Resources +<a class="anchor-link" href="#resources">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Res and ResMut access global resources +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">score</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Score<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> you can use Resources in any system type +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Position<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-keyword z-operator z-rust">&amp;</span>Position</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="local-system-resources">&quot;Local&quot; System Resources +<a class="anchor-link" href="#local-system-resources">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Local&lt;T&gt; resources are unique per-system. Two instances of the same system will each have their own resource. Local resources are automatically initialized to their default value. +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">state</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Local<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>State<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-keyword z-operator z-rust">&amp;</span>Position</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="empty-systems">Empty Systems +<a class="anchor-link" href="#empty-systems">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> for the hyper-minimalists +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="with-without-filters">With/Without Filters +<a class="anchor-link" href="#with-without-filters">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> only runs on entities With or Without a given component +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Without<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Parent, <span class="z-keyword z-operator z-rust">&amp;</span>Position<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> position <span class="z-keyword z-operator z-rust">in</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> query<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="thread-local-systems">Thread-Local Systems +<a class="anchor-link" href="#thread-local-systems">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> systems that must run on the main thread with exclusive access to World and Resources +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">world</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> World, <span class="z-variable z-parameter z-rust">resources</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> Resources</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="stages">Stages +<a class="anchor-link" href="#stages">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> the scheduler provides Stages as a way to run sets of systems in order +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> adds a system to the default stage: &quot;update&quot; +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>movement<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> creates a new stage after &quot;update&quot; +</span> <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_stage_after</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>update<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>do_things<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system_to_stage</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>do_things<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> something<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h4 id="commands">Commands +<a class="anchor-link" href="#commands">#</a> +</h4> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> use Commands to queue up World and Resource changes, which will be applied at the end of the current Stage +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Position<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> Velocity<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Commands can also be used alongside other types +</span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, <span class="z-variable z-parameter z-rust">time</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Time<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">query</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Query<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-keyword z-operator z-rust">&amp;</span>Position<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something +</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="how-do-function-systems-work">How Do Function Systems Work? +<a class="anchor-link" href="#how-do-function-systems-work">#</a> +</h3> +<p>Being able to use Rust functions directly as systems might feel like magic, but I promise it's not! You may have noticed that we do this when registering systems in our App:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">some_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>some_system<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>The <code>.system()</code> call takes the <code>some_system</code> function pointer and converts it to a <code>Box&lt;dyn System&gt;</code>. This works because we implement the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.1.0&#x2F;bevy_ecs/trait.IntoQuerySystem.html"><code>IntoQuerySystem</code></a> trait for all functions that match a certain set of function signatures.</p> +<h3 id="good-bones">Good Bones +<a class="anchor-link" href="#good-bones">#</a> +</h3> +<p>Bevy ECS actually uses a heavily forked version of the minimalist <a href="https://github.com/Ralith/hecs">Hecs ECS</a>. Hecs is an efficient single-threaded archetypal ECS. It provides the core + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.1.0&#x2F;bevy_ecs/struct.World.html"><code>World</code></a>, + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.1.0&#x2F;bevy_ecs/struct.Archetype.html"><code>Archetype</code></a>, and internal + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ecs&#x2F;0.1.0&#x2F;bevy_ecs/trait.Query.html"><code>Query</code></a> data structures. Bevy ECS adds the following on top:</p> +<ul> +<li><b class="fun-list">Function Systems</b>: Hecs actually has no concept of a &quot;system&quot; at all. You just run queries directly on the World. Bevy adds the ability to define portable, schedulable systems using normal Rust functions.</li> +<li><b class="fun-list">Resources</b>: Hecs has no concept of unique/global data. When building games, this is often needed. Bevy adds a <code>Resource</code> collection and resource queries</li> +<li><b class="fun-list">Parallel Scheduler</b>: Hecs is single threaded, but it was designed to allow parallel schedulers to be built on top. Bevy ECS adds a custom dependency-aware scheduler that builds on top of the &quot;Function Systems&quot; mentioned above.</li> +<li><b class="fun-list">Optimization</b>: Hecs is already plenty fast, but by modifying some of its internal data access patterns, we were able to improve performance significantly. This moved it from &quot;fast enough&quot; to &quot;the fastest&quot; (see the benchmark above to compare Bevy ECS to vanilla Hecs).</li> +<li><b class="fun-list">Query Wrappers</b>: The <code>Query</code> Bevy ECS exports is actually a wrapper around Hecs Queries. It provides safe, scoped access to the <code>World</code> in a multi-threaded context and improves the ergonomics of iteration.</li> +<li><b class="fun-list">Change Detection</b>: Automatically (and efficiently) tracks component add/remove/update operations and exposes them in the Query interface.</li> +<li><b class="fun-list">Stable Entity IDs</b>: Almost every ECS (including Hecs) uses unstable entity ids that cannot be used for serialization (scenes / save files) or networking. In Bevy ECS, entity ids are globally unique and stable. You can use them in any context!</li> +</ul> +<p>In the near future I will file an issue on the Hecs git repo offering to upstream whatever changes they want from Bevy ECS. I have a feeling they won't want the &quot;high level&quot; stuff like function systems and parallel scheduling, but I guess we'll see!</p> +<h2 id="bevy-ui">Bevy UI +<a class="anchor-link" href="#bevy-ui">#</a> +</h2> +<p><img src="https://bevyengine.org/news/introducing-bevy/bevy_ui.png" alt="bevy ui" /></p> +<p>Bevy has a custom, but familiar UI system based on the &quot;flex box&quot; model. Well... semi-custom, but more on that later. In the beginning, I heavily considered using <a href="https://github.com/hecrj/iced">one</a> of the <a href="https://github.com/emilk/emigui/">many</a> great <a href="https://github.com/linebender/druid">pre-made</a> UI solutions in the Rust ecosystem. But each of these frameworks felt in some way &quot;separate&quot; from the data-driven ECS approach at the core of Bevy. If we took a framework like <a href="https://github.com/linebender/druid">Druid</a>, which is top-of-its class in terms of design, and then shoe-horned it into the Bevy data / event model, that would <em>compromise</em> the Druid design and Bevy+Druid would end up being less compelling than just using Druid as a standalone framework.</p> +<p>I decided that the only way Bevy could even <em>hope</em> to bring something compelling to the table was to fully embrace the Bevy way of doing things.</p> +<p>Bevy UI directly uses the existing ECS, hierarchy, transform, event, asset, and scene systems at the core of Bevy. Because of this, Bevy UI automatically gets features like hot-reloading of UI scene files, async texture loading, and change detection. A shared architecture means that improvements to any of these systems feed directly into Bevy UI. I am not yet convinced that this approach will produce the best UI framework, but I <em>am</em> convinced that it will produce the best UI framework in the context of a Bevy App.</p> +<p>We are still in the experimental stages and I expect some things to change, but the patterns we've found so far are very promising. Also keep in mind that currently the best way to compose Bevy UIs is with code, but we are in the process of designing a new file format for scenes that should make declarative, file based UI composition much nicer than it currently is.</p> +<h3 id="building-blocks">Building Blocks +<a class="anchor-link" href="#building-blocks">#</a> +</h3> +<p>In Bevy, a UI element is just an ECS Entity with a + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ui&#x2F;0.1.0&#x2F;bevy_ui/struct.Node.html"><code>Node</code></a> component. Nodes are rectangles with a width and height, and are positioned using the same + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_transform&#x2F;0.1.0&#x2F;bevy_transform&#x2F;components/struct.Transform.html"><code>Transform</code></a> component used elsewhere in Bevy. The + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ui&#x2F;0.1.0&#x2F;bevy_ui/struct.Style.html"><code>Style</code></a> component is used to determine how the Node is rendered, sized, and positioned.</p> +<p>The easiest way to add a new node (with all of the required components) is like this:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">NodeComponents<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p> + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ui&#x2F;0.1.0&#x2F;bevy_ui&#x2F;entity/struct.NodeComponents.html"><code>NodeComponents</code></a> is a &quot;component bundle&quot;, which Bevy uses to make spawning entities of various &quot;types&quot; easier.</p> +<h3 id="layout">Layout +<a class="anchor-link" href="#layout">#</a> +</h3> +<p>For layout, Bevy uses a fantastic 100% Rust flexbox implementation called <a href="https://github.com/vislyhq/stretch">Stretch</a>. Stretch provides the algorithms for positioning rectangles in 2D space according to the flexbox spec. Bevy exposes flex properties inside the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ui&#x2F;0.1.0&#x2F;bevy_ui/struct.Style.html"><code>Style</code></a> component mentioned above and renders rectangles with the positions and sizes that Stretch outputs. Bevy uses its own z-layering algorithm to &quot;stack&quot; elements on top of each other, but its basically the same one that HTML/CSS uses.</p> +<h3 id="relative-positioning">Relative Positioning +<a class="anchor-link" href="#relative-positioning">#</a> +</h3> +<p>Nodes are positioned relative to each other by default:</p> +<p><img src="https://bevyengine.org/news/introducing-bevy/relative_position.png" alt="relative positioning" /></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>NodeComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + style<span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Size<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">100.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">100.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>NodeComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + style<span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Size<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Percent<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">40.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Percent<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">40.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="absolute-positioning">Absolute Positioning +<a class="anchor-link" href="#absolute-positioning">#</a> +</h3> +<p>You can &quot;absolutely&quot; position a Node relative to its parent's corners like this:</p> +<p><img src="https://bevyengine.org/news/introducing-bevy/absolute_positioning.png" alt="absolute positioning" /></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>NodeComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + style<span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Size<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Percent<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">40.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Percent<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">40.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + position_type<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">PositionType<span class="z-punctuation z-accessor z-rust">::</span></span>Absolute<span class="z-punctuation z-separator z-rust">,</span> + position<span class="z-punctuation z-separator z-rust">:</span> Rect <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + top<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + right<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="parenting">Parenting +<a class="anchor-link" href="#parenting">#</a> +</h3> +<p>Just like any other Entity, Nodes can have children. Children are positioned and scaled relative to their parent. By default, children will always appear in front of their parents.</p> +<p><img src="https://bevyengine.org/news/introducing-bevy/ui_parenting.png" alt="ui_parenting" /></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>NodeComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + style<span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Size<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Percent<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">60.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Percent<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">60.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + position_type<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">PositionType<span class="z-punctuation z-accessor z-rust">::</span></span>Absolute<span class="z-punctuation z-separator z-rust">,</span> + position<span class="z-punctuation z-separator z-rust">:</span> Rect <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + top<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + right<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">parent</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + parent + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>NodeComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + style<span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Size<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">50.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">50.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">5</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="flexbox">Flexbox +<a class="anchor-link" href="#flexbox">#</a> +</h3> +<p>I won't cover how flexbox works here, but you can use all of the same &quot;flex&quot; properties you would use in a web context. Here is an example of how you would center two Nodes vertically and horizontally within their parent:</p> +<p><img src="https://bevyengine.org/news/introducing-bevy/flex.png" alt="flex" /></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>NodeComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + style<span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Size<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Percent<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">100.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Percent<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">100.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + justify_content<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">JustifyContent<span class="z-punctuation z-accessor z-rust">::</span></span>Center<span class="z-punctuation z-separator z-rust">,</span> + align_items<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">AlignItems<span class="z-punctuation z-accessor z-rust">::</span></span>Center<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">04</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">04</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">04</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">parent</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + parent + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>NodeComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + style<span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Size<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">80.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">80.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>NodeComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + style<span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Size<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">80.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">80.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span>rgb<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">1.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">08</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="text-and-images">Text and Images +<a class="anchor-link" href="#text-and-images">#</a> +</h3> +<p>Nodes can also have Text and Image components, which affect the inferred sizes of nodes.</p> +<p><img src="https://bevyengine.org/news/introducing-bevy/text_and_image.png" alt="text and images" /></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>TextComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + text<span class="z-punctuation z-separator z-rust">:</span> Text <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + value<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Hello from Bevy UI!<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + font<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>FiraSans-Bold.ttf<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + style<span class="z-punctuation z-separator z-rust">:</span> TextStyle <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + font_size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-float z-rust">25.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> + color<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Color<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">WHITE</span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>ImageComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + style<span class="z-punctuation z-separator z-rust">:</span> Style <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + size<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Size<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">200.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Auto</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + position_type<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">PositionType<span class="z-punctuation z-accessor z-rust">::</span></span>Absolute<span class="z-punctuation z-separator z-rust">,</span> + position<span class="z-punctuation z-separator z-rust">:</span> Rect <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + top<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + right<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Val<span class="z-punctuation z-accessor z-rust">::</span></span>Px<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">10.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>bevy_logo.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="interaction-events">Interaction Events +<a class="anchor-link" href="#interaction-events">#</a> +</h3> +<p>Nodes with the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_ui&#x2F;0.1.0&#x2F;bevy_ui/enum.Interaction.html"><code>Interaction</code></a> component will track interaction state. You can easily build widgets like buttons this way:</p> +<p><video controls loop><source src="button.mp4" type="video/mp4"/></video></p> +<p>For example, here is a system that only runs on Buttons where the Interaction state has changed:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">_button</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span>Button, <span class="z-variable z-parameter z-rust">interaction</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Mutated<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Interaction<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">match</span> <span class="z-keyword z-operator z-arithmetic z-rust">*</span>interaction <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">Interaction<span class="z-punctuation z-accessor z-rust">::</span></span>Clicked <span class="z-keyword z-operator z-rust">=&gt;</span> <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>clicked<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">Interaction<span class="z-punctuation z-accessor z-rust">::</span></span>Hovered <span class="z-keyword z-operator z-rust">=&gt;</span> <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>hovered<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-meta z-path z-rust">Interaction<span class="z-punctuation z-accessor z-rust">::</span></span>None <span class="z-keyword z-operator z-rust">=&gt;</span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span></span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-separator z-rust">,</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h2 id="2d-features">2D Features +<a class="anchor-link" href="#2d-features">#</a> +</h2> +<h3 id="sprites"><a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/2d/sprite.rs">Sprites</a> +<a class="anchor-link" href="#sprites">#</a> +</h3> +<p>You can use any + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_render&#x2F;0.1.0&#x2F;bevy_render&#x2F;texture/struct.Texture.html"><code>Texture</code></a> asset as a sprite directly:</p> +<p><img src="https://bevyengine.org/news/introducing-bevy/sprite.png" alt="sprite" /></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> texture <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>icon.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>texture<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="sprite-sheets"><a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/2d/sprite_sheet.rs">Sprite Sheets</a> +<a class="anchor-link" href="#sprite-sheets">#</a> +</h3> +<p>Sprite sheets (also known as texture atlases) can be used for animations, tile sets, or just for optimized sprite rendering.</p> +<p><video controls loop><source src="sprite_sheet.mp4" type="video/mp4"/></video></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> texture_atlas <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">TextureAtlas<span class="z-punctuation z-accessor z-rust">::</span></span>from_grid<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>texture_handle<span class="z-punctuation z-separator z-rust">,</span> texture<span class="z-punctuation z-accessor z-dot z-rust">.</span>size<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">7</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> texture_atlas_handle <span class="z-keyword z-operator z-assignment z-rust">=</span> texture_atlases<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>texture_atlas</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>SpriteSheetComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + texture_atlas<span class="z-punctuation z-separator z-rust">:</span> texture_atlas_handle<span class="z-punctuation z-separator z-rust">,</span> + sprite<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">TextureAtlasSprite<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-integer z-decimal z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="dynamic-texture-atlas-generation"><a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/2d/texture_atlas.rs">Dynamic Texture Atlas Generation</a> +<a class="anchor-link" href="#dynamic-texture-atlas-generation">#</a> +</h3> +<p>Sprites are often produced as individual files. Bevy can combine them into a single sprite sheet dynamically!</p> +<p><img src="https://bevyengine.org/news/introducing-bevy/dynamic_texture_atlas.png" alt="dynamic texture atlas" /></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-keyword z-control z-rust">for</span> sprite_handle <span class="z-keyword z-operator z-rust">in</span> sprite_handles<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> texture <span class="z-keyword z-operator z-assignment z-rust">=</span> textures<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + texture_atlas_builder<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_texture</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>handle<span class="z-punctuation z-separator z-rust">,</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>texture</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + +<span class="z-storage z-type z-rust">let</span> texture_atlas <span class="z-keyword z-operator z-assignment z-rust">=</span> texture_atlas_builder<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">finish</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> textures</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="3d-features">3D Features +<a class="anchor-link" href="#3d-features">#</a> +</h2> +<h3 id="gltf-model-loading"><a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/3d/load_model.rs">GLTF Model Loading</a> +<a class="anchor-link" href="#gltf-model-loading">#</a> +</h3> +<p>Load GLTF files as Mesh assets</p> +<p><img src="https://bevyengine.org/news/introducing-bevy/boat.png" alt="boat render" /></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PbrComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> load the model +</span> mesh<span class="z-punctuation z-separator z-rust">:</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>boat.gltf<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> create a material for the model +</span> material<span class="z-punctuation z-separator z-rust">:</span> materials<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>boat.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">into</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<p>Note: in the near future we will add support for loading GLTF files as Scenes instead of meshes.</p> +<h3 id="depth-based-draw-order"><a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/3d/texture.rs">Depth Based Draw Order</a> +<a class="anchor-link" href="#depth-based-draw-order">#</a> +</h3> +<p>Front-to-back drawing for fast &quot;early fragment discarding&quot; of opaque materials, and back-to-front drawing for correct transparent materials</p> +<p><img src="https://bevyengine.org/news/introducing-bevy/alpha.png" alt="alpha" /></p> +<h3 id="parenting-1"><a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/3d/parenting.rs">Parenting</a> +<a class="anchor-link" href="#parenting-1">#</a> +</h3> +<p>Parent transforms are propagated to their descendants</p> +<p><video controls loop><source src="parenting.mp4" type="video/mp4"/></video></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">commands + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PbrComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + mesh<span class="z-punctuation z-separator z-rust">:</span> cube_handle<span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">with_children</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">|</span></span></span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-variable z-parameter z-rust">parent</span><span class="z-punctuation z-section z-parameters z-end z-rust">|</span></span> </span><span class="z-meta z-function z-closure z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + parent<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>PbrComponents <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + mesh<span class="z-punctuation z-separator z-rust">:</span> cube_handle<span class="z-punctuation z-separator z-rust">,</span> + translation<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-path z-rust">Translation<span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">2.</span><span class="z-constant z-numeric z-float z-rust">0</span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-float z-rust">0.</span><span class="z-constant z-numeric z-float z-rust">0</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + <span class="z-keyword z-operator z-range z-rust">..</span><span class="z-support z-type z-rust">Default</span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h3 id="msaa"><a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/3d/msaa.rs">MSAA</a> +<a class="anchor-link" href="#msaa">#</a> +</h3> +<p>Get nice smooth edges by using Multi-Sample Anti-Aliasing</p> +<p><img src="https://bevyengine.org/news/introducing-bevy/msaa_off.png" alt="msaa_off" /> +<img src="https://bevyengine.org/news/introducing-bevy/msaa_on.png" alt="msaa_on" /></p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_resource</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>Msaa <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> samples<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">8</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> +</span></code></pre> +<h2 id="scenes">Scenes +<a class="anchor-link" href="#scenes">#</a> +</h2> +<p>Scenes are a way to compose pieces of your game/app ahead of time. In Bevy, Scenes are simply a collection of entities and components. A Scene can be &quot;spawned&quot; into a <code>World</code> any number of times. &quot;Spawning&quot; copies the Scene's entities and components into the given <code>World</code>.</p> +<p>Scenes can also be saved to and loaded from &quot;scene files&quot;. One of the primary goals of the future &quot;Bevy Editor&quot; will be to make it easy to compose scene files visually.</p> +<h3 id="file-format">File Format +<a class="anchor-link" href="#file-format">#</a> +</h3> +<p>Scene files are a saved and loaded as a flat list of entities and components:</p> +<pre data-lang="json" class="language-json z-code"><code class="language-json" data-lang="json"><span class="z-source z-json"><span class="z-meta z-sequence z-json"><span class="z-punctuation z-section z-sequence z-begin z-json">[</span> + <span class="z-invalid z-illegal z-expected-sequence-separator z-json">(</span> + <span class="z-invalid z-illegal z-expected-sequence-separator z-json">e</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">n</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">t</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">i</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">t</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">y</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">:</span> <span class="z-constant z-numeric z-integer z-decimal z-json">328997855</span><span class="z-punctuation z-separator z-sequence z-json">,</span> + <span class="z-invalid z-illegal z-expected-sequence-separator z-json">c</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">o</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">m</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">p</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">o</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">n</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">e</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">n</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">t</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">s</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">:</span> <span class="z-meta z-sequence z-json"><span class="z-punctuation z-section z-sequence z-begin z-json">[</span> + <span class="z-meta z-mapping z-json"><span class="z-punctuation z-section z-mapping z-begin z-json">{</span> + </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>Position<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span><span class="z-punctuation z-separator z-mapping z-pair z-json">,</span> + </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>map<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-value z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-meta z-mapping z-json"><span class="z-punctuation z-section z-mapping z-begin z-json">{</span> </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>x<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-constant z-numeric z-float z-decimal z-json">3<span class="z-punctuation z-separator z-decimal z-json">.</span>0</span><span class="z-punctuation z-separator z-mapping z-pair z-json">,</span> </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>y<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-value z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-constant z-numeric z-float z-decimal z-json">4<span class="z-punctuation z-separator z-decimal z-json">.</span>0</span> <span class="z-punctuation z-section z-mapping z-end z-json">}</span></span><span class="z-punctuation z-separator z-mapping z-pair z-json">,</span> + <span class="z-punctuation z-section z-mapping z-end z-json">}</span></span><span class="z-punctuation z-separator z-sequence z-json">,</span> + <span class="z-punctuation z-section z-sequence z-end z-json">]</span></span><span class="z-punctuation z-separator z-sequence z-json">,</span> + <span class="z-invalid z-illegal z-expected-sequence-separator z-json">)</span><span class="z-punctuation z-separator z-sequence z-json">,</span> + <span class="z-invalid z-illegal z-expected-sequence-separator z-json">(</span> + <span class="z-invalid z-illegal z-expected-sequence-separator z-json">e</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">n</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">t</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">i</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">t</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">y</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">:</span> <span class="z-constant z-numeric z-integer z-decimal z-json">404566393</span><span class="z-punctuation z-separator z-sequence z-json">,</span> + <span class="z-invalid z-illegal z-expected-sequence-separator z-json">c</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">o</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">m</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">p</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">o</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">n</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">e</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">n</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">t</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">s</span><span class="z-invalid z-illegal z-expected-sequence-separator z-json">:</span> <span class="z-meta z-sequence z-json"><span class="z-punctuation z-section z-sequence z-begin z-json">[</span> + <span class="z-meta z-mapping z-json"><span class="z-punctuation z-section z-mapping z-begin z-json">{</span> + </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>Position<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span><span class="z-punctuation z-separator z-mapping z-pair z-json">,</span> + </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>map<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-value z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-meta z-mapping z-json"><span class="z-punctuation z-section z-mapping z-begin z-json">{</span> </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>x<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-constant z-numeric z-float z-decimal z-json">1<span class="z-punctuation z-separator z-decimal z-json">.</span>0</span><span class="z-punctuation z-separator z-mapping z-pair z-json">,</span> </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>y<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-value z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-constant z-numeric z-float z-decimal z-json">2<span class="z-punctuation z-separator z-decimal z-json">.</span>0</span> <span class="z-punctuation z-section z-mapping z-end z-json">}</span></span><span class="z-punctuation z-separator z-mapping z-pair z-json">,</span> + <span class="z-punctuation z-section z-mapping z-end z-json">}</span></span><span class="z-punctuation z-separator z-sequence z-json">,</span> + <span class="z-meta z-mapping z-json"><span class="z-punctuation z-section z-mapping z-begin z-json">{</span> + </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>type<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>Name<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span><span class="z-punctuation z-separator z-mapping z-pair z-json">,</span> + </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>map<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-value z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-meta z-mapping z-json"><span class="z-punctuation z-section z-mapping z-begin z-json">{</span> </span><span class="z-meta z-mapping z-key z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>value<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span></span><span class="z-meta z-mapping z-json"><span class="z-punctuation z-separator z-mapping z-key-value z-json">:</span> </span><span class="z-meta z-mapping z-value z-json"><span class="z-string z-quoted z-double z-json"><span class="z-punctuation z-definition z-string z-begin z-json">&quot;</span>Carter<span class="z-punctuation z-definition z-string z-end z-json">&quot;</span></span> <span class="z-punctuation z-section z-mapping z-end z-json">}</span></span><span class="z-punctuation z-separator z-mapping z-pair z-json">,</span> + <span class="z-punctuation z-section z-mapping z-end z-json">}</span></span><span class="z-punctuation z-separator z-sequence z-json">,</span> + <span class="z-punctuation z-section z-sequence z-end z-json">]</span></span><span class="z-punctuation z-separator z-sequence z-json">,</span> + <span class="z-invalid z-illegal z-expected-sequence-separator z-json">)</span><span class="z-punctuation z-separator z-sequence z-json">,</span> +<span class="z-punctuation z-section z-sequence z-end z-json">]</span></span> +</span></code></pre> +<p>The numbers assigned to the <code>entity</code> fields are entity's id, which are completely optional. If no entity id is provided, one will be randomly generated when the scene is loaded. We have <a href="https://gist.github.com/cart/3e77d6537e1a0979a69de5c6749b6bcb">plans to improve this format</a> in the future to be more ergonomic, indent entity hierarchies, and support nested scenes.</p> +<h3 id="loading-and-instancing">Loading and Instancing +<a class="anchor-link" href="#loading-and-instancing">#</a> +</h3> +<p>Scenes can be added to a <code>World</code> using the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_scene&#x2F;0.1.0&#x2F;bevy_scene/struct.SceneSpawner.html"><code>SceneSpawner</code></a> resource. Spawning can be done with either + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_scene&#x2F;0.1.0&#x2F;bevy_scene/struct.SceneSpawner.html#method.load"><code>SceneSpawner::load()</code></a> or + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_scene&#x2F;0.1.0&#x2F;bevy_scene/struct.SceneSpawner.html#method.instance"><code>SceneSpawner::instance()</code></a>. &quot;Loading&quot; a Scene preserves the entity IDs in it. This is useful for something like a save file where you want entity ids to be constant and changes to be applied on top of entities already in the world. &quot;Instancing&quot; adds entities to the <code>World</code> with brand-new IDs, which allows multiple &quot;instances&quot; of a scene to exist in the same World.</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">load_scene_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">scene_spawner</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>SceneSpawner<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Scenes are loaded just like any other asset. +</span> <span class="z-storage z-type z-rust">let</span> scene<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Scene<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>my_scene.scn<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Spawns the scene with entity ids preserved +</span> scene_spawner<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>scene</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Spawns the scene with new entity ids +</span> scene_spawner<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">instance</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>scene</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="saving-ecs-worlds-to-scenes">Saving ECS Worlds To Scenes +<a class="anchor-link" href="#saving-ecs-worlds-to-scenes">#</a> +</h3> +<p>Any ECS <code>World</code> can be converted to a scene like this:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> scene <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">Scene<span class="z-punctuation z-accessor z-rust">::</span></span>from_world<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>world<span class="z-punctuation z-separator z-rust">,</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>component_type_registry</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>You can then convert the scene to a RON formatted string like this:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> ron_string <span class="z-keyword z-operator z-assignment z-rust">=</span> scene<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">serialize_ron</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>property_type_registry</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-keyword z-operator z-rust">?</span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h3 id="hot-scene-reloading">Hot Scene Reloading +<a class="anchor-link" href="#hot-scene-reloading">#</a> +</h3> +<p>Changes to Scene files can be automatically applied to spawned Scenes at runtime. This allows for immediate feedback without restarts or recompiles.</p> +<p><video controls loop><source src="hot_reloading.mp4" type="video/mp4"/></video></p> +<p>Note that the video above is not sped up. Scene changes are effectively applied instantaneously.</p> +<h3 id="how-does-this-work">How Does This Work? +<a class="anchor-link" href="#how-does-this-work">#</a> +</h3> +<p>Scenes are built on top of Bevy's Property and Asset systems. Components can be used in scenes provided they derive the <code>Properties</code> trait. Properties are what enable scene serialization, deserialization, and patching changes at runtime. Check out the next section for more details.</p> +<h2 id="properties">Properties +<a class="anchor-link" href="#properties">#</a> +</h2> +<p>In a nutshell, Bevy Properties add some dynamism to Rust, which is a notoriously static language. It is often useful to get or set a struct's field using a string version of its name, or interact with a struct when you don't have a statically typed reference. Languages generally cover these cases with &quot;reflection&quot; features, but unfortunately Rust does not currently have this type of reflection. I built the <code>bevy_property</code> crate to provide a subset of useful &quot;reflection-like&quot; features in Rust. Here is a quick surface-level introduction:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Properties</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-modifier z-rust">pub</span> <span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">Counter</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">count</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">u32</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> counter <span class="z-keyword z-operator z-assignment z-rust">=</span> Counter <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> count<span class="z-punctuation z-separator z-rust">:</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">1</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> You can set a property value like this. The type must match exactly or this will fail. +</span>counter<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">set_prop_val<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>count<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>counter<span class="z-punctuation z-accessor z-dot z-rust">.</span>count<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>counter<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">prop_val<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">u32</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>count<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">2</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> You can also set properties dynamically. set_prop accepts any type that implements the Property trait, but the property type must match the field type or this operation will fail. +</span><span class="z-storage z-type z-rust">let</span> new_count<span class="z-punctuation z-separator z-rust">:</span> <span class="z-storage z-type z-rust">u32</span> <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">3</span><span class="z-punctuation z-terminator z-rust">;</span> +counter<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">set_prop</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>count<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>new_count</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>counter<span class="z-punctuation z-accessor z-dot z-rust">.</span>count<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">3</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> DynamicProperties also implements the Properties trait, but it has no restrictions on field names or types +</span><span class="z-storage z-type z-rust">let</span> <span class="z-storage z-modifier z-rust">mut</span> patch <span class="z-keyword z-operator z-assignment z-rust">=</span> <span class="z-meta z-path z-rust">DynamicProperties<span class="z-punctuation z-accessor z-rust">::</span></span>map<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +patch<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">set_prop_val<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-storage z-type z-rust">usize</span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>count<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">4</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> You can &quot;apply&quot; Properties on top of other Properties. This will only set properties with the same name and type. You can use this to &quot;patch&quot; your properties with new values. +</span>counter<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">apply</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>patch</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-support z-macro z-rust">assert_eq!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>counter<span class="z-punctuation z-accessor z-dot z-rust">.</span>count<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-numeric z-integer z-decimal z-rust">4</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> Types that implement Properties can be converted to DynamicProperties +</span><span class="z-storage z-type z-rust">let</span> dynamic_thing<span class="z-punctuation z-separator z-rust">:</span> DynamicProperties <span class="z-keyword z-operator z-assignment z-rust">=</span> counter<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_dynamic</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Properties are what make Bevy's Scene system so nice to use. I also plan to use them for features in the upcoming Bevy Editor, such as undo/redo, viewing and editing component properties at runtime, and property animation tools.</p> +<p>Types that implement Properties can be serialized using <a href="https://serde.rs/">serde</a> and <code>DynamicProperties</code> can be deserialized using serde. When combined with the <code>Properties</code> patching feature, this means any type that derives <code>Properties</code> can be round trip serialized and deserialized.</p> +<p>To derive <code>Properties</code> each field in the struct must implement the <code>Property</code> trait. This is already implemented for most core Rust and Bevy types, so you should only need to implement <code>Property</code> for custom types (and you can derive <code>Property</code> too).</p> +<p>I have a feeling that the <code>bevy_property</code> crate will be useful in non-Bevy contexts, so I'll be publishing it to crates.io in the near future.</p> +<h2 id="events">Events +<a class="anchor-link" href="#events">#</a> +</h2> +<p>Bevy uses a double-buffered event system that enables efficient event production and consumption with zero-allocation event consumers. Here is a complete Bevy app that produces and consumes a custom event:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">main</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-meta z-path z-rust">App<span class="z-punctuation z-accessor z-rust">::</span></span>build<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">add_event<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>event_producer<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>event_consumer<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">system</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> + <span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">run</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyEvent</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">message</span><span class="z-punctuation z-separator z-type z-rust">:</span> String, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">event_producer</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">my_events</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Events<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + my_events<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">send</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>MyEvent <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> message<span class="z-punctuation z-separator z-rust">:</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>Hello<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">to_string</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">Default</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">State</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-variable z-other z-member z-rust">reader</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-meta z-generic z-rust">EventReader<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> + +<span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">event_consumer</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">state</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Local<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>State<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">my_events</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Events<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> event <span class="z-keyword z-operator z-rust">in</span> state<span class="z-punctuation z-accessor z-dot z-rust">.</span>reader<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>my_events</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-support z-macro z-rust">println!</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>received message: <span class="z-constant z-other z-placeholder z-rust">{}</span><span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-separator z-rust">,</span> event<span class="z-punctuation z-accessor z-dot z-rust">.</span>message<span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p><code>app.add_event::&lt;MyEvent&gt;()</code> adds a new + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_app&#x2F;0.1.0&#x2F;bevy_app/struct.Events.html"><code>Events</code></a> resource for MyEvent and a system that swaps the <code>Events&lt;MyEvent&gt;</code> buffers every update. + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_app&#x2F;0.1.0&#x2F;bevy_app/struct.EventReader.html"><code>EventReader</code></a>s are very cheap to create. They are essentially just an array index that tracks the last event that has been read.</p> +<p>Events are used in Bevy for features like window resizing, assets, and input. The tradeoff for being both allocation and cpu efficient is that each system only has one chance to receive an event, otherwise it will be lost on the next update. I believe this is the correct tradeoff for apps that run in a loop (ex: games).</p> +<h2 id="assets">Assets +<a class="anchor-link" href="#assets">#</a> +</h2> +<p>Bevy + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_asset&#x2F;0.1.0&#x2F;bevy_asset/struct.Assets.html"><code>Assets</code></a> are just typed data that can be referenced using asset + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_asset&#x2F;0.1.0&#x2F;bevy_asset/struct.Handle.html"><code>Handle</code></a>s. For example, 3d meshes, textures, fonts, materials, scenes, and sounds are assets. <code>Assets&lt;T&gt;</code> is a generic collection of assets of type <code>T</code>. In general asset usage looks like this:</p> +<h3 id="asset-creation">Asset Creation +<a class="anchor-link" href="#asset-creation">#</a> +</h3> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">create_texture_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">textures</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Texture<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> creates a new Texture asset and returns a handle, which can then be used to retrieve the actual asset +</span> <span class="z-storage z-type z-rust">let</span> texture_handle<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Texture<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> textures<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Texture<span class="z-punctuation z-accessor z-rust">::</span></span>default<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="asset-access">Asset Access +<a class="anchor-link" href="#asset-access">#</a> +</h3> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">read_texture_system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">textures</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Texture<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">texture_handle</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-rust">&amp;</span><span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Texture<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> retrieves a Texture using the current entity&#39;s Handle&lt;Texture&gt; component +</span> <span class="z-storage z-type z-rust">let</span> texture<span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>Texture <span class="z-keyword z-operator z-assignment z-rust">=</span> textures<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>texture_handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="asset-events">Asset Events +<a class="anchor-link" href="#asset-events">#</a> +</h3> +<p>The <code>Assets&lt;T&gt;</code> collection is basically just a map from <code>Handle&lt;T&gt;</code> to <code>T</code> that records created, modified, and removed <code>Events</code>. These events can also be consumed as a system resource, just like any other <code>Events</code>:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">state</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Local<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>State<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">texture_events</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Events<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetEvent<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">for</span> event <span class="z-keyword z-operator z-rust">in</span> state<span class="z-punctuation z-accessor z-dot z-rust">.</span>reader<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">iter</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>texture_events</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-meta z-path z-rust">AssetEvent<span class="z-punctuation z-accessor z-rust">::</span></span>Created <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> handle </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> event <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-block z-rust"><span class="z-punctuation z-definition z-comment z-rust">/*</span> do something with created asset <span class="z-punctuation z-definition z-comment z-rust">*/</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="asset-server">Asset Server +<a class="anchor-link" href="#asset-server">#</a> +</h3> +<p>The <code>Assets&lt;T&gt;</code> collection doesn't know anything about filesystems or multi-threading. This is the responsibility of the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_asset&#x2F;0.1.0&#x2F;bevy_asset/struct.AssetServer.html"><code>AssetServer</code></a> resource:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">commands</span><span class="z-punctuation z-separator z-rust">:</span> Commands, <span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-storage z-modifier z-rust">mut</span> <span class="z-variable z-parameter z-rust">textures</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">ResMut<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span><span class="z-meta z-generic z-rust">Assets<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Texture<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this will begin asynchronously loading &quot;texture.png&quot; in parallel +</span> <span class="z-storage z-type z-rust">let</span> texture_handle<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>Texture<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>texture.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> the texture may not be loaded yet, but you can still add the handle as a component immediately. +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> whenever possible, internal Bevy systems will wait for assets to be ready before using them: +</span> <span class="z-storage z-type z-rust">let</span> entity <span class="z-keyword z-operator z-assignment z-rust">=</span> commands<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">spawn</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>texture_handle<span class="z-punctuation z-separator z-rust">,</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> you can also asynchronously load entire folders (recursively) by adding them as an &quot;asset folder&quot; +</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load_asset_folder</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>assets<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> you can get the handle of any asset (either currently loading or loaded) like this: +</span> <span class="z-storage z-type z-rust">let</span> music_handle<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AudioSource<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get_handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>assets/music.mp3<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> when assets have finished loading, they are automatically added to the appropriate Assets&lt;T&gt; collection +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> you can check if an asset is ready like this: +</span> <span class="z-keyword z-control z-rust">if</span> <span class="z-storage z-type z-rust">let</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>texture</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> textures<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">get</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>texture_handle</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span> <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> do something with texture +</span> </span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> sometimes you want access to an asset immediately. you can block the current system until an asset has +</span> <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> finished loading and immediately update Assets&lt;T&gt; using the &quot;load_sync&quot; method +</span> <span class="z-storage z-type z-rust">let</span> cool_sprite<span class="z-punctuation z-separator z-rust">:</span> <span class="z-keyword z-operator z-bitwise z-rust">&amp;</span>Texture <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load_sync</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-keyword z-operator z-bitwise z-rust">&amp;</span><span class="z-storage z-modifier z-rust">mut</span> textures<span class="z-punctuation z-separator z-rust">,</span> <span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>assets/cool_sprite.png<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<h3 id="hot-reloading">Hot Reloading +<a class="anchor-link" href="#hot-reloading">#</a> +</h3> +<p>You can enable asset change detection by calling:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">watch_for_changes</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>This will load new versions of assets whenever their files have changed.</p> +<h3 id="adding-new-asset-types">Adding New Asset Types +<a class="anchor-link" href="#adding-new-asset-types">#</a> +</h3> +<p>To add a new asset type, implement the + + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_asset&#x2F;0.1.0&#x2F;bevy_asset/trait.AssetLoader.html"><code>AssetLoader</code></a> trait. This tells Bevy what file formats to look for and how to translate the file bytes into the given asset type.</p> +<p>Once you have implemented <code>AssetLoader&lt;MyAsset&gt;</code> for <code>MyAssetLoader</code> you can register your new loader like this:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust">app<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-meta z-path z-rust">add_asset_loader<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyAsset, MyAssetLoader<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>Then you can access the <code>Assets&lt;MyAsset&gt;</code> resource, listen for change events, and call <code>asset_server.load(&quot;something.my_asset&quot;)</code></p> +<h2 id="sound">Sound +<a class="anchor-link" href="#sound">#</a> +</h2> +<p>You can currently load and play sounds like this:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-function z-rust"><span class="z-meta z-function z-rust"><span class="z-storage z-type z-function z-rust">fn</span> </span><span class="z-entity z-name z-function z-rust">system</span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-begin z-rust">(</span><span class="z-variable z-parameter z-rust">asset_server</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AssetServer<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span>, <span class="z-variable z-parameter z-rust">audio_output</span><span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Res<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AudioOutput<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span></span><span class="z-meta z-function z-rust"><span class="z-meta z-function z-parameters z-rust"><span class="z-punctuation z-section z-parameters z-end z-rust">)</span></span></span></span><span class="z-meta z-function z-rust"> </span><span class="z-meta z-function z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-type z-rust">let</span> music<span class="z-punctuation z-separator z-rust">:</span> <span class="z-meta z-generic z-rust">Handle<span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>AudioSource<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span> <span class="z-keyword z-operator z-assignment z-rust">=</span> asset_server<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">load</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>music.mp3<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> this will play the music asynchronously as soon as it has loaded +</span> audio_output<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>music</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + + <span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> if you already have an AudioSource reference you can play it immediately like this: +</span> audio_output<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">play_source</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>audio_source</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>We plan on extending the audio system with more control and features in the future.</p> +<h2 id="render-graph">Render Graph +<a class="anchor-link" href="#render-graph">#</a> +</h2> +<p>All render logic is built on top of Bevy's + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_render&#x2F;0.1.0&#x2F;bevy_render&#x2F;render_graph/struct.RenderGraph.html"><code>RenderGraph</code></a>. The Render Graph is a way to encode atomic units of render logic. For example, you might create graph nodes for a 2D pass, UI pass, cameras, texture copies, swap chains, etc. Connecting a node to another node indicates that there is a dependency of some kind between them. By encoding render logic this way, the Bevy renderer is able to analyze dependencies and render the graph in parallel. It also has the benefit of encouraging developers to write modular render logic.</p> +<p>Bevy includes a number of nodes by default: <code>CameraNode</code>, <code>PassNode</code>, <code>RenderResourcesNode</code>, <code>SharedBuffersNode</code>, <code>TextureCopyNode</code>, <code>WindowSwapChainNode</code>, and <code>WindowTextureNode</code>. It also provides subgraphs for 2d rendering, 3d rendering, and UI rendering. But you are welcome to create your own nodes, your own graphs, or extend the included graphs!</p> +<h3 id="data-driven-shaders"><a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/shader/shader_custom_material.rs">Data Driven Shaders</a> +<a class="anchor-link" href="#data-driven-shaders">#</a> +</h3> +<p>Components and Assets can derive the + + + + + + + + + + + + + + +<a href="https:&#x2F;&#x2F;docs.rs/bevy_render&#x2F;0.1.0&#x2F;bevy_render&#x2F;renderer/trait.RenderResources.html"><code>RenderResources</code></a> trait, which enables them to be directly copied to GPU resources and used as shader uniforms.</p> +<p>Binding uniforms to a custom shader is literally as simple as deriving <code>RenderResources</code> on your component or asset:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">RenderResources<span class="z-punctuation z-separator z-rust">,</span> Default</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyMaterial</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-modifier z-rust">pub</span> <span class="z-variable z-other z-member z-rust">color</span><span class="z-punctuation z-separator z-type z-rust">:</span> Color, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>And then adding a new RenderResourceNode to the Render Graph:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> create the new node +</span>render_graph<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_system_node</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>my_material<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">RenderResourcesNode<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-generic z-rust"><span class="z-punctuation z-definition z-generic z-begin z-rust">&lt;</span>MyMaterial<span class="z-punctuation z-definition z-generic z-end z-rust">&gt;</span></span><span class="z-meta z-path z-rust"><span class="z-punctuation z-accessor z-rust">::</span></span>new<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-constant z-language z-rust">true</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> + +<span class="z-comment z-line z-double-slash z-rust"><span class="z-punctuation z-definition z-comment z-rust">//</span> connect the new node to the &quot;main pass node&quot; +</span>render_graph<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add_node_edge</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-string z-quoted z-double z-rust"><span class="z-punctuation z-definition z-string z-begin z-rust">&quot;</span>my_material<span class="z-punctuation z-definition z-string z-end z-rust">&quot;</span></span><span class="z-punctuation z-separator z-rust">,</span> <span class="z-meta z-path z-rust">base<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-meta z-path z-rust">node<span class="z-punctuation z-accessor z-rust">::</span></span><span class="z-constant z-other z-rust">MAIN_PASS</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">unwrap</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<p>From there, MyMaterial components will be automatically copied to GPU buffers. A shader can then reference an entity's MyMaterial like this:</p> +<pre data-lang="c" class="language-c z-code"><code class="language-c" data-lang="c"><span class="z-source z-c"><span class="z-meta z-function-call z-c"><span class="z-variable z-function z-c">layout</span><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span></span></span><span class="z-meta z-function-call z-c"><span class="z-meta z-group z-c">set <span class="z-keyword z-operator z-assignment z-c">=</span> <span class="z-constant z-numeric z-integer z-decimal z-c">1</span><span class="z-punctuation z-separator z-c">,</span> binding <span class="z-keyword z-operator z-assignment z-c">=</span> <span class="z-constant z-numeric z-integer z-decimal z-c">1</span></span><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-end z-c">)</span></span></span> uniform MyMaterial_color <span class="z-meta z-block z-c"><span class="z-punctuation z-section z-block z-begin z-c">{</span> + vec4 color<span class="z-punctuation z-terminator z-c">;</span> +<span class="z-punctuation z-section z-block z-end z-c">}</span></span><span class="z-punctuation z-terminator z-c">;</span> +</span></code></pre> +<p>I think the simplicity of the <a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/shader/shader_custom_material.rs">fully self-contained custom shader example</a> speaks for itself.</p> +<h3 id="shader-defs"><a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/shader/shader_defs.rs">Shader Defs</a> +<a class="anchor-link" href="#shader-defs">#</a> +</h3> +<p>Components and Assets can also add &quot;shader defs&quot; to selectively enable shader code on a per-entity basis:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">derive</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">RenderResources<span class="z-punctuation z-separator z-rust">,</span> ShaderDefs<span class="z-punctuation z-separator z-rust">,</span> Default</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> +<span class="z-meta z-struct z-rust"><span class="z-storage z-type z-struct z-rust">struct</span> </span><span class="z-meta z-struct z-rust"><span class="z-entity z-name z-struct z-rust">MyMaterial</span> </span><span class="z-meta z-struct z-rust"><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + <span class="z-storage z-modifier z-rust">pub</span> <span class="z-variable z-other z-member z-rust">color</span><span class="z-punctuation z-separator z-type z-rust">:</span> Color, + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">render_resource</span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span></span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust">ignore</span></span><span class="z-meta z-annotation z-parameters z-rust"><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-meta z-annotation z-rust"><span class="z-punctuation z-definition z-annotation z-rust">#</span><span class="z-punctuation z-section z-group z-begin z-rust">[</span><span class="z-variable z-annotation z-rust">shader_def</span><span class="z-punctuation z-section z-group z-end z-rust">]</span></span> + <span class="z-storage z-modifier z-rust">pub</span> <span class="z-variable z-other z-member z-rust">always_blue</span><span class="z-punctuation z-separator z-type z-rust">:</span> <span class="z-storage z-type z-rust">bool</span>, +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span></span> +</span></code></pre> +<p>Then in your fragment shader you could do something like this:</p> +<pre data-lang="c" class="language-c z-code"><code class="language-c" data-lang="c"><span class="z-source z-c"><span class="z-storage z-type z-c">void</span> <span class="z-meta z-function z-c"><span class="z-entity z-name z-function z-c">main</span></span><span class="z-meta z-function z-parameters z-c"><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span></span></span><span class="z-meta z-function z-parameters z-c"><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-end z-c">)</span></span></span><span class="z-meta z-function z-c"> </span><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"><span class="z-punctuation z-section z-block z-begin z-c">{</span></span></span><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> + o_Target <span class="z-keyword z-operator z-assignment z-c">=</span> color<span class="z-punctuation z-terminator z-c">;</span> +<span class="z-meta z-preprocessor z-c"><span class="z-keyword z-control z-import z-c"># ifdef</span> MYMATERIAL_ALWAYS_BLUE +</span> o_Target <span class="z-keyword z-operator z-assignment z-c">=</span> <span class="z-meta z-function-call z-c"><span class="z-variable z-function z-c">vec4</span><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span></span></span><span class="z-meta z-function-call z-c"><span class="z-meta z-group z-c"><span class="z-constant z-numeric z-float z-decimal z-c">0<span class="z-punctuation z-separator z-decimal z-c">.</span>0</span><span class="z-punctuation z-separator z-c">,</span> <span class="z-constant z-numeric z-float z-decimal z-c">0<span class="z-punctuation z-separator z-decimal z-c">.</span>0</span><span class="z-punctuation z-separator z-c">,</span> <span class="z-constant z-numeric z-float z-decimal z-c">1<span class="z-punctuation z-separator z-decimal z-c">.</span>0</span><span class="z-punctuation z-separator z-c">,</span> <span class="z-constant z-numeric z-float z-decimal z-c">1<span class="z-punctuation z-separator z-decimal z-c">.</span>0</span><span class="z-meta z-function-call z-c"><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-end z-c">)</span></span></span></span></span><span class="z-punctuation z-terminator z-c">;</span> +<span class="z-meta z-preprocessor z-c"><span class="z-keyword z-control z-import z-c"># endif</span></span> +</span></span><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"><span class="z-punctuation z-section z-block z-end z-c">}</span></span></span> +</span></code></pre> +<p>Any entity with a <code>MyMaterial</code> component and <code>always_blue: true</code> will be rendered blue. If <code>always_blue</code> is false, it will be rendered with <code>color</code>.</p> +<p>We currently use this feature for toggling &quot;shadeless&quot; rendering and optional textures, but I anticipate it being useful in a variety of contexts.</p> +<h3 id="shader-layout-reflection"><a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/shader/shader_custom_material.rs">Shader Layout Reflection</a> +<a class="anchor-link" href="#shader-layout-reflection">#</a> +</h3> +<p>Bevy can automatically reflect shader data layouts from SpirV shaders (and from GLSL shaders by compiling them to SpirV). This means that creating custom shaders is as simple as this:</p> +<pre data-lang="rs" class="language-rs z-code"><code class="language-rs" data-lang="rs"><span class="z-source z-rust"><span class="z-storage z-type z-rust">let</span> shader_stages <span class="z-keyword z-operator z-assignment z-rust">=</span> ShaderStages <span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-begin z-rust">{</span> + vertex<span class="z-punctuation z-separator z-rust">:</span> shaders<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Shader<span class="z-punctuation z-accessor z-rust">::</span></span>from_glsl<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">ShaderStage<span class="z-punctuation z-accessor z-rust">::</span></span>Vertex<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-other z-rust">VERTEX_SHADER</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> + fragment<span class="z-punctuation z-separator z-rust">:</span> <span class="z-support z-type z-rust">Some</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>shaders<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">Shader<span class="z-punctuation z-accessor z-rust">::</span></span>from_glsl<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">ShaderStage<span class="z-punctuation z-accessor z-rust">::</span></span>Fragment<span class="z-punctuation z-separator z-rust">,</span> <span class="z-constant z-other z-rust">FRAGMENT_SHADER</span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-separator z-rust">,</span> +</span><span class="z-meta z-block z-rust"><span class="z-punctuation z-section z-block z-end z-rust">}</span></span><span class="z-punctuation z-terminator z-rust">;</span> +<span class="z-storage z-type z-rust">let</span> pipeline_handle <span class="z-keyword z-operator z-assignment z-rust">=</span> pipelines<span class="z-punctuation z-accessor z-dot z-rust">.</span><span class="z-support z-function z-rust">add</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span><span class="z-meta z-path z-rust">PipelineDescriptor<span class="z-punctuation z-accessor z-rust">::</span></span>default_config<span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-begin z-rust">(</span>shader_stages</span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span></span><span class="z-meta z-group z-rust"><span class="z-punctuation z-section z-group z-end z-rust">)</span></span><span class="z-punctuation z-terminator z-rust">;</span> +</span></code></pre> +<h2 id="productive-compile-times">Productive Compile Times +<a class="anchor-link" href="#productive-compile-times">#</a> +</h2> +<p>One of my primary design goals for Bevy is &quot;productivity&quot;. Game development is an extremely iterative and experimental process full of small changes. If each change takes a significant amount of time to test, then development becomes a grind. Here is my personal &quot;acceptability scale&quot; for iterative changes:</p> +<ul> +<li><b class="fun-list">0-1 seconds</b>: ideal</li> +<li><b class="fun-list">1-3 seconds</b>: fine</li> +<li><b class="fun-list">3-5 seconds</b>: annoying</li> +<li><b class="fun-list">5-10 seconds</b>: painful but still usable if you are committed</li> +<li><b class="fun-list">10+ seconds</b>: completely unusable</li> +</ul> +<p>Note that these are &quot;iterative compile times&quot; not &quot;clean compile times&quot;. Clean compiles only need to happen once, whereas iterative compiles happen constantly. I care a lot less about the &quot;clean compile&quot; metric when it comes to productivity, although it is still important to keep clean compile times down for other reasons.</p> +<p>One of the most popular Rust engines today takes <em>over 30 seconds</em> to compile a single newline inserted into trivial examples. That is categorically unproductive and makes real game-dev practically impossible.</p> +<p>Currently, with the &quot;fast compiles&quot; configuration, changes to Bevy examples can be compiled in ~0.8-3 seconds, based on your computer specs, configuration, and OS choice (more on this later). There is of course always room for improvement here, but Bevy currently falls into my &quot;usability sweet spot&quot;.</p> +<p>The &quot;Rust compiles slow&quot; meme exists largely because many Rust projects aren't thinking enough about the compile time performance implications of certain code patterns. Rust code generally compiles slowly for three reasons:</p> +<ul> +<li><b class="fun-list">Generic Monomorphization</b>: The compile step where generic code gets turned into a non-generic copy. Compile times go up as the volume of monomorphized code goes up. To keep costs low you should either avoid generics entirely or keep generic code &quot;small&quot; and shallow.</li> +<li><b class="fun-list">Link Time</b>: How long it takes to link code. Here the important thing is to keep code volume and dependency counts low.</li> +<li><b class="fun-list">LLVM</b>: Rust throws a large amounts of IR code at LLVM and expects it to optimize it. This takes time. Additionally LLVM is optimized for &quot;fast code at runtime&quot; more than &quot;fast code generation&quot;.</li> +</ul> +<p>The LLVM bit is out of our hands (for now). Keeping generic usage low and shallow isn't a particularly hard problem, provided you employ that mindset from the beginning. Link times, on the other hand, are a constant and very real &quot;enemy&quot; of iterative compile times. Linking happens on every iterative compile. Adding any code to your project will increase link times. Adding any dependency to your project will increase link times.</p> +<p>The cards are stacked against us for a variety of reasons:</p> +<ul> +<li><b class="fun-list">The Game Engine Domain</b> +<ul> +<li>Game engines inherently touch a large number of domains (and therefore involve a large number of dependencies)</li> +<li>Game engines are &quot;big&quot; ... they require a lot of code</li> +</ul> +</li> +<li><b class="fun-list">Rust's Design Choices</b> +<ul> +<li>Dependencies are statically linked by default, which means every new dependency adds link times</li> +<li>Rust's default linker is quite slow</li> +<li>Cargo makes taking dependencies very easy. What appears to be a small, simple crate might actually have a large dependency tree</li> +</ul> +</li> +</ul> +<p>One solution to this problem is to avoid dependencies at all costs and write the smallest amount of code that you can. The <a href="https://github.com/not-fl3/macroquad">Macroquad</a> project is a great example of this. They employ a minimalist approach to code and avoid any dependency that doesn't meet their strict compile time requirements. As a result, I think its fair to say that they are the fastest compiling (while still usable) Rust game engine, both for clean and iterative compiles. However their approach comes at the cost of dependency aversion.</p> +<p>Bevy takes a slightly more pragmatic approach. First, being willing to take dependencies is good for the Rust ecosystem. I don't want to ignore all of the great work that has already been done, especially when it comes to projects like <a href="https://github.com/rust-windowing/winit">winit</a> and <a href="https://github.com/gfx-rs/wgpu-rs">wgpu</a>. But we still strive to keep our dependency tree as small as we can. And any dependency that takes Bevy out of the &quot;ideal to fine&quot; iterative compile time range must either be pared down or removed. When combined with the &quot;Fast Compiles&quot; configuration, this results in nice compile times.</p> +<h3 id="the-fast-compiles-configuration">The &quot;Fast Compiles&quot; Configuration +<a class="anchor-link" href="#the-fast-compiles-configuration">#</a> +</h3> +<p>The &quot;fast compiles&quot; configuration is how we achieve usable iterative compile times while still taking dependencies. It consists of three parts:</p> +<ul> +<li><b class="fun-list">LLD linker</b>: LLD is <em>much faster</em> at linking than the default Rust linker. This is the biggest win.</li> +<li><b class="fun-list">Nightly Rust Compiler</b>: Gives access to the latest performance improvements and &quot;unstable&quot; optimizations. Note that Bevy can still be compiled on stable Rust if that is a requirement for you.</li> +<li><b class="fun-list">Generic Sharing</b>: Allows crates to share monomorphized generic code instead of duplicating it. In some cases this allows us to &quot;precompile&quot; generic code so it doesn't affect iterative compiles.</li> +</ul> +<p>To enable fast compiles, install the nightly rust compiler and LLD. Then copy <a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/.cargo/config_fast_builds">this file</a> to <code>YOUR_WORKSPACE/.cargo/config</code></p> +<h3 id="current-limitations-and-future-improvements">Current Limitations and Future Improvements +<a class="anchor-link" href="#current-limitations-and-future-improvements">#</a> +</h3> +<p>While Bevy is currently &quot;productive&quot; by my criteria, it isn't all sunshine and rainbows yet. First, MacOS doesn't have an up-to-date version of the LLD linker and therefore iterative compiles are <em>much</em> slower on that platform. Additionally, LLD is <em>slightly</em> slower on Windows than it is on Linux. On my machine I get ~1.5-3.0 seconds on Windows vs ~0.8-3.0 seconds on Linux.</p> +<h4 id="dynamic-linking-to-the-rescue">Dynamic Linking to the Rescue +<a class="anchor-link" href="#dynamic-linking-to-the-rescue">#</a> +</h4> +<p>An easy way to cut down on link times is to just dynamically link instead. On my 2013 MacBook Pro running MacOS (with no LLD), I was able to drop iterative Bevy compile times from ~6 seconds to ~0.6 seconds by dynamically linking app plugins. Bevy actually already has support for dynamic App plugins, but the new Bevy ECS does not currently support dynamic linking because it relies on TypeIds (which are incompatible with dynamic linking). Fortunately, I have already solved the TypeId problem in other projects, so we should be able to add this back soon.</p> +<h4 id="cranelift-rustc-backend">Cranelift Rustc Backend +<a class="anchor-link" href="#cranelift-rustc-backend">#</a> +</h4> +<p>Cranelift is an alternative compiler backend that is optimized for fast compiles. The <a href="https://github.com/bjorn3/rustc_codegen_cranelift">rustc cranelift backend</a> is rapidly approaching a usable state. I'm hoping it will give us a nice boost eventually.</p> +<h2 id="example-game-breakout">Example Game: Breakout +<a class="anchor-link" href="#example-game-breakout">#</a> +</h2> +<p>If you are curious about what actual Bevy game code looks like, check out the <a href="https://github.com/bevyengine/bevy/blob/1d68094f59b01e14f44ed7db8907dbd011b59973/examples/game/breakout.rs">breakout example</a>. Forgive my slightly janky collision code please :)</p> +<p><video controls loop><source src="breakout.mp4" type="video/mp4"/></video></p> +<h2 id="why-build-bevy">Why Build Bevy? +<a class="anchor-link" href="#why-build-bevy">#</a> +</h2> +<p>There are plenty of fantastic engines out there ... why build another one? Especially when there are already so many in the Rust ecosystem?</p> +<p>First a bit about me: I decided to build Bevy after years of contributing code to other engines (ex: Godot). I spent over four years <a href="https://www.youtube.com/c/cartdev">building a game in Godot</a> and I also have experience with Unity, Unreal, and a number of other frameworks like SDL and Three.js. I have built multiple custom engines in the past using Rust, Go, HTML5, and Java. I have also used and/or closely followed most of the current players in the Rust gamedev ecosystem. I recently quit my job as Senior Software Engineer at Microsoft and my experience there deeply affected my opinions of software and what it should be.</p> +<p>These experiences led me to want the following from a game engine:</p> +<ul> +<li><b class="fun-list">Free and Open Source</b>: It needs to be free and open source with <em>no strings attached</em>. Games are a huge part of our culture and humanity is investing <em>millions</em> of hours into the development of games. Why are we (as game developers / engine developers) continuing to build up the ecosystems of closed-source monopolies that take cuts of our sales and deny us visibility into the tech we use daily? As a community I believe we can do so much better. This criteria eliminates Unreal and Unity, despite their huge feature sets.</li> +<li><b class="fun-list">Productive</b>: It needs to have fast build/run/test loops, which translates to either scripting languages or fast compile times in native languages. But scripting languages introduce runtime overhead, cognitive load, and a barrier between me and the actual engine, so my preference here is a native language with fast compile times. Sadly compile times are a huge problem in the Rust ecosystem and many Rust engines have prohibitively long iterative compiles. Fortunately Rust game engines like Macroquad and coffee prove that productive iterative compile times are possible.</li> +<li><b class="fun-list">Turtles All The Way Down</b>: Ideally the engine is written in the same language that games are. Being able to run an IDE &quot;go to definition&quot; command on a symbol in your game and hop directly into the engine source is an extremely powerful concept. You also don't need to worry about heavy language translation layers or lossy abstractions. If an engine's community builds games in the same language as the engine, they are more likely (and able) to contribute back to the engine.</li> +<li><b class="fun-list">Simple</b>: It needs to be easy to use for common tasks, but it also can't hide the details from you. Many engines are either &quot;easy to use but too high level&quot; or &quot;very low level but difficult to do common tasks in&quot;. Additionally, many engines in Rust are littered with lifetimes and generics. Both are powerful tools to be sure, but they also introduce cognitive load and reduce ergonomics. Generics can also have a huge impact on compile times if you aren't careful.</li> +<li><b class="fun-list">Editor</b>: It needs to have an (optional) graphical editor. Scene creation is a large part of game development and in many cases visual editors beat code. As a bonus, the editor should be built <em>in the engine</em>. Godot uses this approach and it is <em>so smart</em>. Doing so <a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">dogfoods</a> the engine's UI system and creates positive feedback loops. Improvements to the editor are also often improvements to the core engine. It also makes sure your engine is flexible enough to build tooling (and not just games). I personally consider building an engine's editor in another stack to be a missed opportunity (ex: the web, QT, native widgets).</li> +<li><b class="fun-list">Data Driven</b>: It needs to be data-driven/data-oriented/data-first. ECS is a common way of doing this, but it definitely isn't the only way. These paradigms can make your game faster (cache friendly, easier to parallelize), but they also make common tasks like game state serialization and synchronization delightfully straightforward.</li> +</ul> +<p>None of the engines on the market <em>quite</em> line up with what I'm looking for. And the changes required to make them meet my requirements are either massive in scope, impossible (closed source), or unwelcome (the things I want aren't what the developers or customers want). On top of that, making new game engines is fun!</p> +<p>Bevy is not trying to out-compete other open-source game engines. As much as possible we should be collaborating and building common foundations. If you are an open source game engine developer and you think a Bevy component would make your engine better, one of your engine's components could make Bevy better, or both, please reach out! Bevy is already benefitting massively from the efforts of the Rust gamedev ecosystem and we would love to pay it forward in whatever way we can.</p> +<h2 id="what-s-next">What's Next? +<a class="anchor-link" href="#what-s-next">#</a> +</h2> +<p>I'm proud of how far Bevy has come in a relatively short period of time, but there is still plenty of work left to do. These will be our focus areas over the coming months:</p> +<h3 id="physically-based-rendering-pbr">Physically Based Rendering (PBR) +<a class="anchor-link" href="#physically-based-rendering-pbr">#</a> +</h3> +<p>Bevy's current 3D renderer is extremely bare bones. As I primarily make 3D games, improving the 3D renderer is a priority for me. We will be adding PBR shaders, shadows, more lighting options, skeletal animation, improved GLTF import, ambient occlusion (implementation TBD), and probably a bunch of other things.</p> +<h3 id="editor">Editor +<a class="anchor-link" href="#editor">#</a> +</h3> +<p>Bevy was architected with a visual editor in mind. The Scene and Properties systems were specifically built to make game&lt;-&gt;editor dataflow nicer. The editor will be built as a Bevy App and will utilize the existing Bevy UI, Bevy ECS, Scene, and Properties features. I like the &quot;build the editor in the engine&quot; approach because improvements to the editor are often improvements to the engine, and vice-versa. Additionally, it ensures that Bevy is capable of building non-game apps and tooling.</p> +<h3 id="platform-support-android-ios-web">Platform Support: Android, iOS, Web +<a class="anchor-link" href="#platform-support-android-ios-web">#</a> +</h3> +<p>Under the hood Bevy uses <a href="https://github.com/rust-windowing/winit">winit</a> (for multi-platform windows and input) and <a href="https://github.com/gfx-rs/wgpu-rs">wgpu</a> (for multi-platform rendering). Each of these projects has varying degrees of support for the platforms above. And in general Bevy was designed to be platform-agnostic, so supporting the platforms above should be possible with a little bit of work.</p> +<h3 id="render-batching-and-instancing">Render Batching and Instancing +<a class="anchor-link" href="#render-batching-and-instancing">#</a> +</h3> +<p>Right now Bevy can render plenty fast for most use cases, but when it comes to rendering huge amounts of objects (tens of thousands) it isn't quite there yet. To accomplish that, we need to implement batching / instancing. These concepts can be defined in a number of ways, but the general gist is that we will be grouping as much geometry and data into the smallest number of draw calls possible, while also reducing GPU state changes as much as possible. I'm hoping Bevy's data driven shader approach will make the instancing implementation simple and extensible.</p> +<h3 id="canvas">Canvas +<a class="anchor-link" href="#canvas">#</a> +</h3> +<p>Right now the only way to draw UI and 2D scenes is via sprites and rectangles. Bevy needs an immediate-mode drawing API capable of drawing anti-aliased curves and shapes. This can then be used to do code-driven drawing of things like rounded corners in Bevy UI, performance graphs in the editor, etc. It's very possible that we will integrate projects like <a href="https://github.com/servo/pathfinder">pathfinder</a> or <a href="https://github.com/nical/lyon">lyon</a> for this.</p> +<h3 id="animation">Animation +<a class="anchor-link" href="#animation">#</a> +</h3> +<p>Animation permeates almost everything in gamedev. First, I want to add a general purpose code-first animation system. Then on top of that we will add a property-based timeline system that can be saved to a config file and visualized / edited in the Bevy Editor.</p> +<h3 id="nicer-scene-format">Nicer Scene Format +<a class="anchor-link" href="#nicer-scene-format">#</a> +</h3> +<p>The current scene format is workable, but it isn't yet ideal for manual scene composition because it is a flat list of unordered entities. I also want to add nested scenes. Eventually, I would like the scene format to <a href="https://gist.github.com/cart/3e77d6537e1a0979a69de5c6749b6bcb">look something like this</a>.</p> +<h3 id="dynamic-plugin-loading">Dynamic Plugin Loading +<a class="anchor-link" href="#dynamic-plugin-loading">#</a> +</h3> +<p>To mitigate the cost of compiling and linking plugins and make hot-code-reloading possible, we will provide the option to dynamically load App plugins. Bevy actually already supports this feature, but there is one hangup: Rust's <code>TypeId</code>. TypeIds are unstable across binaries, which means <code>TypeId::of::&lt;T&gt;()</code> in the host binary will not match <code>TypeId::of::&lt;T&gt;()</code> in a dynamically loaded binary. Bevy ECS uses TypeIds, which means dynamically loaded ECS types won't behave correctly. In the past, Bevy used a custom fork of the Legion ECS (where we fixed the TypeId problem). But since moving to Bevy ECS the problem has resurfaced. The fix is to apply the same approach we used in Legion to Bevy ECS.</p> +<h3 id="physics">Physics +<a class="anchor-link" href="#physics">#</a> +</h3> +<p>Many games require collision detection and physics. I'm planning on building a plug-able physics interface with <a href="https://nphysics.org/">nphysics / ncollide</a> as the first backend.</p> +<h3 id="polish">Polish +<a class="anchor-link" href="#polish">#</a> +</h3> +<p>There are plenty of areas that need more design work or features. For example, I think the core Render Graph is in a pretty good state, but the mid-level and high level rendering APIs need more time and experimentation. I also want to rethink how materials are composed. If you are curious about all of the improvements on our radar, check out the <a href="https://github.com/bevyengine/bevy/issues">Bevy issue tracker on GitHub</a>.</p> +<h3 id="documentation">Documentation +<a class="anchor-link" href="#documentation">#</a> +</h3> +<p>Bevy's APIs are still very unstable, so I haven't spent much time documenting anything yet. <a href="https://bevyengine.org/learn/book/introduction/">The Bevy Book</a> is still small and the <a href="https://docs.rs/bevy">Rust API Docs</a> have plenty of gaps. In general I subscribe to the idea of &quot;documentation proportional to stability&quot;. As features stabilize and design patterns emerge, we will increase efforts in both of those areas.</p> +<h2 id="join-the-bevy">Join the Bevy! +<a class="anchor-link" href="#join-the-bevy">#</a> +</h2> +<p>If any of this sounds interesting to you, I encourage you to check out <a href="https://github.com/bevyengine/bevy">Bevy on GitHub</a>, read <a href="https://bevyengine.org/learn/book/introduction/">The Bevy Book</a>, and <a href="https://bevyengine.org/community/">join the Bevy community</a>. Currently Bevy is 100% built by volunteers, so if you want to help us build the next great game engine, <a href="https://discord.com/invite/gMUk5Ph">please reach out</a>! We need all the help we can get, especially if you are a:</p> +<ul> +<li><b class="fun-list">Software Developer</b>: check out the <a href="/learn/book/contributing/code">Contributing Code</a> section of The Bevy Book.</li> +<li><b class="fun-list">Technical Writer</b>: check out the <a href="/learn/book/contributing/docs">Contributing Docs</a> section of The Bevy Book.</li> +</ul> +<p>I want Bevy to become a vibrant developer community ... thats actually why I chose the name! A Bevy is a group of birds, just like we are a group of game developers. Join the Bevy!</p> +<img src="/assets/bevy_logo_dark.svg" style="height: 4.0rem; margin-top: 2.0rem" /> + + + diff --git a/community/donate/aceeri/index.html b/community/donate/aceeri/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/aceeri/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/alice-i-cecile/index.html b/community/donate/alice-i-cecile/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/alice-i-cecile/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/cart/index.html b/community/donate/cart/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/cart/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/cleancut/index.html b/community/donate/cleancut/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/cleancut/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/harudagondi.svg b/community/donate/harudagondi.svg new file mode 100644 index 0000000000..954df7f8ed --- /dev/null +++ b/community/donate/harudagondi.svg @@ -0,0 +1,25 @@ + + + + Favicon + + + + + + + + + + + + Favicon + + + Gio Genre De Asis + + + + + + diff --git a/community/donate/harudagondi/index.html b/community/donate/harudagondi/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/harudagondi/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/index.html b/community/donate/index.html new file mode 100644 index 0000000000..0c99e91ffc --- /dev/null +++ b/community/donate/index.html @@ -0,0 +1,1482 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Supporting Bevy Development + + + +
+ +
+
+ + +
+ +
+ + Supporting Bevy + +
+
+ + + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+

+ Bevy is a community-driven project and many of us rely on financial support to continue building Bevy. + Bevy is built by a large group of people, so consider backing the ones that are building what you care about! + If you are uncertain, a + Project Lead, + Maintainer, or + SME + is a good choice. You can learn more about these roles here. +

+

+ If you are interested in backing Bevy in a big way (and you would like to see your logo on Bevy's home page), + consider supporting one of our Maintainers at one + of the following tiers: +

    +
  • Bronze: $100 / month
  • +
  • Silver: $200 / month
  • +
  • Gold: $300 / month
  • +
  • Platinum: $1000 / month
  • +
  • Diamond: $4000 / month
  • +
  • Patron: Anything over $100,000 / year
  • +
+ + If a maintainer offers these roles in their sponsors page, that counts! If you are interested in Patron sponsorship, contact us directly. + Reach out to us here if you have any questions about sponsorship or you would like to claim a sponsorship reward. +

+

+ All Bevy leaders sign our Sponsorship Pledge to ensure the needs of the Bevy Community always come first. +

+
+ + +
+ + + + + +
+
+
+
+ Carter Anderson +
+ +
+ + + +
+ +
+
+ + +
+ + +
Project Lead
+ + + +
Maintainer
+ + +
+ + +
+ Full-time lead developer, project manager, and original creator of Bevy. Focused on building out core engine systems, guiding project direction, and managing the community. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ James Liu +
+ +
+ + + +
+ +
+
+ + +
+ + +
Maintainer
+ + + +
SME-ECS
+ + + +
SME-Animation
+ + +
+ + +
+ Performance by default. A slow engine is an unused engine. Focused on animation, networking, and general engine performance and UX. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Alice Cecile +
+ +
+ + + +
+ +
+
+ + +
+ + +
Maintainer
+ + +
+ + +
+ Technical project manager, mad scientist, and documentation lead. Loves tinkering with ECS features. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ François Mockers +
+ +
+ + + +
+ +
+
+ + +
+ + +
Maintainer
+ + + +
SME-Animation
+ + +
+ + +
+ Helping everything run smoothly, and having fun with Bevy! +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Gino Valente +
+ +
+ + + +
+ +
+
+ + +
+ + +
SME-Reflection
+ + +
+ + +
+ React Native developer during the day, Bevy contributor at night. Focused mainly on Bevy's reflection system. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ harudagondi +
+ +
+ + + +
+ +
+
+ + + +
+ Chemistry enthusiast, interested in audio and music stuff. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Nicola Papale +
+ +
+ + + +
+ +
+
+ + + +
+ Making games at devildahu. Author of bevy-ui-navigation, cuicui and many other bevy-related crates. Incidentally contributes to bevy. Touches reflection, rendering, ui and ecs. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Aceeri +
+ +
+ + + +
+ +
+
+ + + +
+ Average Rust and game enjoyer +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Nathan Stocks +
+ +
+ + + +
+ +
+
+ + + +
+ Indie Game Dev, Rust Instructor, Rusty Engine creator. Senior Software Engineer at GitHub. Family, Food, Rust, Python, Open Source, Maple Trees. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Thierry Berger +
+ +
+ + + +
+ +
+
+ + + +
+ Helping one project after the other, fixing papercuts along the way. Tell me about yours! +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Ida "Iyes" +
+ +
+ + + +
+ +
+
+ + + +
+ Likes to teach and explain things. Talks a lot (sometimes with her cat). Makes games, sometimes music and other creative things. Community is Love. Ice is Win. 👀 +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Kurt Kühnert +
+ +
+ + + +
+ +
+
+ + + +
+ German master's student specializing in computer graphics. Author of bevy_terrain. Focused on improving the ergonomics and documentation of Bevy's renderer. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Nile +
+ +
+ + + +
+ +
+
+ + + +
+ Formerly active member of the community, and still the uncontested owner of the highest message count on the bevy discord. I will one day return to the forefront of mad science! 🧪 +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + +
+ + +
+ +
+
+
+ + + diff --git a/community/donate/inodentry/index.html b/community/donate/inodentry/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/inodentry/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/james7132/index.html b/community/donate/james7132/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/james7132/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/kurtkuehnert/index.html b/community/donate/kurtkuehnert/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/kurtkuehnert/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/mockersf/index.html b/community/donate/mockersf/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/mockersf/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/mrgvsv/index.html b/community/donate/mrgvsv/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/mrgvsv/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/nicopap/index.html b/community/donate/nicopap/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/nicopap/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/therawmeatball/index.html b/community/donate/therawmeatball/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/therawmeatball/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/donate/vrixyz/index.html b/community/donate/vrixyz/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/donate/vrixyz/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/index.html b/community/index.html new file mode 100644 index 0000000000..6c9dd68037 --- /dev/null +++ b/community/index.html @@ -0,0 +1,348 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bevy Community + + + + + + + diff --git a/community/links.toml b/community/links.toml new file mode 100644 index 0000000000..711b1ee832 --- /dev/null +++ b/community/links.toml @@ -0,0 +1,69 @@ +[[links]] +title = "GitHub" +subtitle = "bevyengine" +url = "https://github.com/bevyengine/bevy" +image = "/assets/github.svg" +image_alt = "GitHub logo" +description = "Interact with Bevy's source code, report issues, and suggest changes" + +[[links]] +title = "Bevy People" +url = "/community/people/" +image = "/assets/people.svg" +image_alt = "People image" +description = "Members of The Bevy Organization and the Bevy Community" + +[[links]] +title = "Bevy Q&A" +subtitle = "bevyengine" +url = "https://github.com/bevyengine/bevy/discussions/categories/q-a" +image = "/assets/q_and_a.svg" +image_alt = "Q and A logo" +description = "The go-to place to ask Bevy questions and get Bevy answers" + +[[links]] +title = "Bevy Assets" +url = "/assets/" +image = "/assets/bevy_icon_dark.svg" +image_alt = "Bevy logo" +description = "List of community projects in Bevy, including plugins, games, books, and tutorials." + +[[links]] +title = "Discord" +subtitle = "Bevy Engine" +url = "https://discord.gg/bevy" +image = "/assets/discord.svg" +image_alt = "Discord logo" +description = "A community to discuss Bevy, Rust, and game development" + +[[links]] +title = "Twitter" +subtitle = "bevyengine" +url = "https://twitter.com/BevyEngine" +image = "/assets/twitter.svg" +image_alt = "Twitter logo" +description = "Quick updates and shared Bevy content from the community" + +[[links]] +title = "Reddit" +subtitle = "/r/bevy" +url = "https://www.reddit.com/r/bevy/" +image = "/assets/reddit.svg" +image_alt = "Reddit logo" +description = "Stay up to date on Bevy news, share your games or plugins, and discuss Bevy." + +[[links]] +title = "itch.io" +subtitle = "bevy" +url = "https://itch.io/games/tag-bevy" +image = "/assets/itchio-textless.svg" +image_alt = "itch.io logo" +description = 'Games tagged with "bevy" on itch.io.' + +[[links]] +title = "Mastodon" +subtitle = "bevy" +url = "https://mastodon.social/@bevy" +image = "/assets/mastodon-logo-purple.svg" +image_alt = "Mastodon logo" +description = "News, boosted community creations and chatter on the short-form Fediverse network." diff --git a/community/people/community members/0crispy/index.html b/community/people/community members/0crispy/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/0crispy/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/cryscan/index.html b/community/people/community members/cryscan/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/cryscan/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/daslixou/index.html b/community/people/community members/daslixou/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/daslixou/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/feenster/index.html b/community/people/community members/feenster/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/feenster/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/index.html b/community/people/community members/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/community/people/community members/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/jacopograndi/index.html b/community/people/community members/jacopograndi/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/jacopograndi/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/killercup/index.html b/community/people/community members/killercup/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/killercup/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/lewiszlw/index.html b/community/people/community members/lewiszlw/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/lewiszlw/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/nylestroke/index.html b/community/people/community members/nylestroke/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/nylestroke/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/paul-hansen/index.html b/community/people/community members/paul-hansen/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/paul-hansen/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/phaestusfox/index.html b/community/people/community members/phaestusfox/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/phaestusfox/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/schell/index.html b/community/people/community members/schell/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/schell/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/shelim/index.html b/community/people/community members/shelim/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/shelim/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/wpederzoli/index.html b/community/people/community members/wpederzoli/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/wpederzoli/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/community members/zkat/index.html b/community/people/community members/zkat/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/community members/zkat/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/index.html b/community/people/index.html new file mode 100644 index 0000000000..2b4c31bb07 --- /dev/null +++ b/community/people/index.html @@ -0,0 +1,3574 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + People + + + +
+ +
+
+ + +
+ +
+ + People + +
+
+ + + + + +
+
+
+
+ + + + + + + + + + + + + + + + +
+
+
+ + + + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ The Bevy community! If you want to see yourself here, submit a pull request! +
+ + + + +

+ The Bevy Organization# +

+ + +
+

+ The Bevy Organization is the group of people responsible for stewarding the Bevy project. It handles things + like choosing project direction, merging pull requests, managing bugs / issues / feature requests, running + the Bevy website, controlling access to secrets, defining and enforcing best practices, etc. +

+

+ Anyone with a history of contributing to Bevy can join the Bevy Organization. Reach out to the Project Lead + if you would like to join! +

+

+ +

+ Roles# +

+
+
+
Project Leads
+
have the final call on all design and code changes within Bevy. They are responsible for representing the project publicly and they choose how the project is organized.
+
+
+
Maintainers
+
have merge rights in Bevy repos. They assess the scope of pull requests and whether they fit into the Bevy project's vision. They also serve as representatives of the Bevy project.
+
+
+
SMEs
+
(Subject Matter Experts) have proven themselves to be experts in a given development area. They help guide Bevy's direction in their area and they are great people to reach out to if you have questions about a given area.
+
+
+
Other members, without a special role, are part of the GitHub organization. They have the power to manage GitHub issues and pull requests.
+
+
+

+
+ + + + +

+ Members# +

+ + + + + +
+ + + + + +
+
+
+
+ Carter Anderson +
+ +
+ + + +
+ +
+
+ + +
+ + +
Project Lead
+ + + +
Maintainer
+ + +
+ + +
+ Full-time lead developer, project manager, and original creator of Bevy. Focused on building out core engine systems, guiding project direction, and managing the community. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Rob Swain +
+ +
+ + + +
+ +
+
+ + +
+ + +
Maintainer
+ + + +
SME-Rendering
+ + +
+ + +
+ Wielder of light. Turning data into shiny. I love to discuss ideas and help people figure out how to do stuff, or to find other people who can help - please ask me questions! ❤️ +
+ + + +
+
+
+ + + +
+
+
+
+ James Liu +
+ +
+ + + +
+ +
+
+ + +
+ + +
Maintainer
+ + + +
SME-ECS
+ + + +
SME-Animation
+ + +
+ + +
+ Performance by default. A slow engine is an unused engine. Focused on animation, networking, and general engine performance and UX. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ François Mockers +
+ +
+ + + +
+ +
+
+ + +
+ + +
Maintainer
+ + + +
SME-Animation
+ + +
+ + +
+ Helping everything run smoothly, and having fun with Bevy! +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Alice Cecile +
+ +
+ + + +
+ +
+
+ + +
+ + +
Maintainer
+ + +
+ + +
+ Technical project manager, mad scientist, and documentation lead. Loves tinkering with ECS features. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Joy +
+ +
+ + + +
+ +
+
+ + +
+ + +
SME-ECS
+ + +
+ + +
+ I keep getting tricked into working on the ECS, but I'm also invested in improving the plugin system, input handling, and general UX. +
+ + + +
+
+
+ + + +
+
+
+
+ Gino Valente +
+ +
+ + + +
+ +
+
+ + +
+ + +
SME-Reflection
+ + +
+ + +
+ React Native developer during the day, Bevy contributor at night. Focused mainly on Bevy's reflection system. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Rob Macdonald +
+ +
+
+ + +
+ + +
SME-Rendering
+ + +
+ + +
+ rust, python, maths, rendering, games +
+ + + +
+
+
+ + + +
+
+
+
+ JMS +
+ +
+ + + +
+ +
+
+ + + +
+ I � pretty lighting. Meant to do UI stuff. Somehow ended up working on 3D rendering. Will get back to that, eventually(?). +
+ + + +
+
+
+ + + +
+
+
+
+ VitalyR, Vitaly Ankh +
+ +
+ + + +
+ +
+
+ + + +
+ Programmer and mathematics learner. Interested in programming language theory, algebraic topology, computer graphics and computer architeture. +
+ + + +
+
+
+ + + +
+
+
+
+ Nile +
+ +
+ + + +
+ +
+
+ + + +
+ Formerly active member of the community, and still the uncontested owner of the highest message count on the bevy discord. I will one day return to the forefront of mad science! 🧪 +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Ida "Iyes" +
+ +
+ + + +
+ +
+
+ + + +
+ Likes to teach and explain things. Talks a lot (sometimes with her cat). Makes games, sometimes music and other creative things. Community is Love. Ice is Win. 👀 +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Nicola Papale +
+ +
+ + + +
+ +
+
+ + + +
+ Making games at devildahu. Author of bevy-ui-navigation, cuicui and many other bevy-related crates. Incidentally contributes to bevy. Touches reflection, rendering, ui and ecs. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Mike Hsu +
+ +
+ + + +
+ +
+
+ + + +
+ Lapsed physics major finding refuge in the programming world for going on 20 years. Mostly been focused on messing with the scheduler and task pool for my work on bevy. +
+ + + +
+
+
+ + + +
+
+
+
+ Joseph Giordano +
+ +
+ + + +
+ +
+
+ + + +
+ Undergrad computer science student, open source enthusiast, and hobbyist game developer. Author of the crate 'bevy-trait-query'. +
+ + + +
+
+
+ + + +
+
+
+
+ Aceeri +
+ +
+ + + +
+ +
+
+ + + +
+ Average Rust and game enjoyer +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Rob Parrett +
+ +
+ + + +
+ +
+
+ + + +
+ Mobile game dev in a former life, playing with Rust in his spare time. +
+ + + +
+
+
+ + + +
+
+
+
+ Thierry Berger +
+ +
+ + + +
+ +
+
+ + + +
+ Helping one project after the other, fixing papercuts along the way. Tell me about yours! +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Nathan Stocks +
+ +
+ + + +
+ +
+
+ + + +
+ Indie Game Dev, Rust Instructor, Rusty Engine creator. Senior Software Engineer at GitHub. Family, Food, Rust, Python, Open Source, Maple Trees. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Niklas Eicker +
+ +
+ + + +
+ +
+
+ + + +
+ Maintainer of some 3rd-party plugins. Likes joining game jams using Bevy. +
+ + + +
+
+
+ + + +
+
+
+
+ Jakob Hellermann +
+ +
+ + + +
+ +
+
+ + + +
+ Currently switching between editor tooling, graphics and scripting. Otherwise interested in music, nature, and figuring stuff out. +
+ + + +
+
+
+ + + +
+
+
+
+ Kurt Kühnert +
+ +
+ + + +
+ +
+
+ + + +
+ German master's student specializing in computer graphics. Author of bevy_terrain. Focused on improving the ergonomics and documentation of Bevy's renderer. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ harudagondi +
+ +
+ + + +
+ +
+
+ + + +
+ Chemistry enthusiast, interested in audio and music stuff. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ icesentry +
+ +
+ + + +
+ +
+
+ + + +
+ Bevy contributor with a focus on rendering, I use bevy almost every day for work and for fun. +
+ + + +
+
+
+ + + +
+
+
+
+ Aevyrie Roessler +
+ +
+ + + +
+ +
+
+ + + +
+ Formerly a Mechanical Engineer, now building CAD software in Bevy. I maintain a number of 3rd-party Bevy crates. Feel free to reach out and say hello! +
+ + + +
+
+
+ + +
+ + + + + + +

+ Community Members# +

+ + + + + + +
+

+ People in the Bevy community who are not part of the organization. +

+

+ Anyone can add themselves here! Submit a pull request! +

+
+ + + +
+ + + + + +
+
+
+
+ Paul Hansen +
+ +
+ + + +
+ +
+
+ + + +
+ Slayer of Windows bugs. Currently working on an unannounced 2d space RPG using Bevy in my free time. Happy to help where I can. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Phaestus Fox or Phox for short +
+ +
+ + + +
+ +
+
+ + + +
+ I am a small youtuber, attempted game dev and avid doc reader. I'm happy to help wherever and whenever I can. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Jos Feenstra +
+ +
+ + + +
+ +
+
+ + + +
+ Developer of 3D things. Author of `hedron`: procedural modelling for bevy. Feel free to reach out! +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Piotr Kosek +
+ +
+ + + +
+ +
+
+ + + +
+ An IT passionate and veteran, legends says his very first video game was conceived in former millennium (it was a PowerPoint game book in 1999 actually) +
+ + + +
+
+
+ + + +
+
+
+
+ Crispy +
+ +
+ + + +
+ +
+
+ + + +
+ I make games and devlogs on Youtube. Huge fan of Rust and Bevy! +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ cryscan +
+ +
+ + + +
+ +
+
+ + + +
+ Developer of bevy-hikari and bounce-up. Interested in rendering, animation and robotics. +
+ + + +
+
+
+ + + +
+
+
+
+ Schell Carl Scivally +
+ +
+ + + +
+ +
+
+ + + +
+ Author of apecs, mogwai and various game and gui libraries. Bevy contributor. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + + +
+
+
+
+ Linwei Zhang +
+ +
+ + + +
+ +
+ +
+
+ + + +
+
+
+
+ William Pederzoli +
+ +
+ + + +
+ +
+
+ + + +
+ Software engineer with a passion for games (and game engines) +
+ + + +
+
+
+ + + +
+
+
+
+ Vladyslav Potapenko +
+ +
+ + + +
+ +
+
+ + + +
+ Full-Stack Software Engineer (Angular, NestJS). A Software-Developer Enthusiast. +
+ + + +
+
+
+ + + +
+
+
+
+ Pascal Hertleif +
+ +
+ + + +
+ +
+
+ + + +
+ Rust developer interested in type systems, neat APIs, and thus obvious follower of the bevy project +
+ + + +
+
+
+ + + +
+
+
+
+ zjikra +
+ +
+ + + +
+ +
+
+ + + +
+ games and networking :) +
+ + + +
+
+
+ + + +
+
+
+
+ Lixou +
+ +
+ + + +
+ +
+
+ + + +
+ German developer kiddo. Sometimes streaming game development with rust and bevy +
+ + + +
+
+
+ + + +
+
+
+
+ Kat Marchán +
+ +
+ + + +
+ +
+
+ + + +
+ Maintainer for Big Brain, a Utility AI library for Bevy, as well as KDL, an alternative document format. +
+ + +
+ + + + Sponsor me! +
+ + +
+
+
+ + +
+ + + +
+ +
+
+ +
+
+
+ + + diff --git a/community/people/the bevy organization/aceeri/index.html b/community/people/the bevy organization/aceeri/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/aceeri/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/aevyrie/index.html b/community/people/the bevy organization/aevyrie/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/aevyrie/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/alice-i-cecile/index.html b/community/people/the bevy organization/alice-i-cecile/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/alice-i-cecile/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/cart/index.html b/community/people/the bevy organization/cart/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/cart/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/cleancut/index.html b/community/people/the bevy organization/cleancut/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/cleancut/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/harudagondi.svg b/community/people/the bevy organization/harudagondi.svg new file mode 100644 index 0000000000..954df7f8ed --- /dev/null +++ b/community/people/the bevy organization/harudagondi.svg @@ -0,0 +1,25 @@ + + + + Favicon + + + + + + + + + + + + Favicon + + + Gio Genre De Asis + + + + + + diff --git a/community/people/the bevy organization/harudagondi/index.html b/community/people/the bevy organization/harudagondi/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/harudagondi/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/hymm/index.html b/community/people/the bevy organization/hymm/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/hymm/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/icesentry/index.html b/community/people/the bevy organization/icesentry/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/icesentry/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/index.html b/community/people/the bevy organization/index.html new file mode 100644 index 0000000000..2c2d5f88cb --- /dev/null +++ b/community/people/the bevy organization/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a section.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/inodentry/index.html b/community/people/the bevy organization/inodentry/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/inodentry/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/jakobhellermann/index.html b/community/people/the bevy organization/jakobhellermann/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/jakobhellermann/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/james7132/index.html b/community/people/the bevy organization/james7132/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/james7132/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/jms55/index.html b/community/people/the bevy organization/jms55/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/jms55/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/jojojet/index.html b/community/people/the bevy organization/jojojet/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/jojojet/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/kurtkuehnert/index.html b/community/people/the bevy organization/kurtkuehnert/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/kurtkuehnert/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/maniwani/index.html b/community/people/the bevy organization/maniwani/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/maniwani/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/mockersf/index.html b/community/people/the bevy organization/mockersf/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/mockersf/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/mrgvsv/index.html b/community/people/the bevy organization/mrgvsv/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/mrgvsv/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/nicopap/index.html b/community/people/the bevy organization/nicopap/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/nicopap/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/niklasei/index.html b/community/people/the bevy organization/niklasei/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/niklasei/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/robtfm/index.html b/community/people/the bevy organization/robtfm/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/robtfm/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/rparrett/index.html b/community/people/the bevy organization/rparrett/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/rparrett/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/superdump/index.html b/community/people/the bevy organization/superdump/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/superdump/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/therawmeatball/index.html b/community/people/the bevy organization/therawmeatball/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/therawmeatball/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/vitalyankh/index.html b/community/people/the bevy organization/vitalyankh/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/vitalyankh/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/community/people/the bevy organization/vrixyz/index.html b/community/people/the bevy organization/vrixyz/index.html new file mode 100644 index 0000000000..2bbc7ae709 --- /dev/null +++ b/community/people/the bevy organization/vrixyz/index.html @@ -0,0 +1,43 @@ + + + Zola + + +
+

Welcome to Zola!

+

+ You're seeing this page because we couldn't find a template to render. +

+

+ To modify this page, create a page.html file in the templates directory or + install a theme. +
+ You can find what variables are available in this template in the documentation. +

+
+ + + + diff --git a/components.js b/components.js new file mode 100644 index 0000000000..0150e8c2e5 --- /dev/null +++ b/components.js @@ -0,0 +1,43 @@ +// clamp a number to the given range +function clamp(val, min, max) { + return Math.min(Math.max(val, min), max) +} + +// inserts the input element required to activate image_compare components +// +// Usage in a document should look like: +// ```html +//
+//
+// Apples +// Oranges +//
+//
+// ``` +// +// The `image_compare` scss component should be used. +// +// Ideally the `aspect-ratio` should be set, but it will fallback to 16/9. +// You can provide `--slider-min`, `--slider-max`, `--slider-value` styles +// which will set the minimum, maximum, & starting value of the slider. They +// default to 7%, 93%, and 50% respectively. +function enable_image_compare() { + const image_compares = document.querySelectorAll("div.image-compare"); + for (const img_cmp of image_compares) { + // insert the input only when js is running + let style = window.getComputedStyle(img_cmp); + const slider = document.createElement('input'); + slider.type = "range"; + slider.min = style.getPropertyValue('--slider-min').replace('%', ''); + slider.max = style.getPropertyValue('--slider-max').replace('%', ''); + slider.value = style.getPropertyValue('--slider-value').replace('%', ''); + img_cmp.appendChild(slider); + // setup callback + slider.addEventListener("input", (event) => { + img_cmp.style.setProperty('--slider-value', clamp(slider.value, slider.min, slider.max) + "%"); + }); + } +} + +export { enable_image_compare }; diff --git a/elasticlunr.min.js b/elasticlunr.min.js new file mode 100644 index 0000000000..79dad65f52 --- /dev/null +++ b/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.6 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o) { + commands.spawn(Camera2dBundle::default()); + // text + commands.spawn(TextBundle::from_section( + "Hold 'Left' or 'Right' to change the line width", + TextStyle { + font: asset_server.load("fonts/FiraMono-Medium.ttf"), + font_size: 24., + color: Color::WHITE, + }, + )); +} + +fn system(mut gizmos: Gizmos, time: Res