mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 04:33:37 +00:00
Doc/module style doc blocks for examples (#4438)
# Objective Provide a starting point for #3951, or a partial solution. Providing a few comment blocks to discuss, and hopefully find better one in the process. ## Solution Since I am pretty new to pretty much anything in this context, I figured I'd just start with a draft for some file level doc blocks. For some of them I found more relevant details (or at least things I considered interessting), for some others there is less. ## Changelog - Moved some existing comments from main() functions in the 2d examples to the file header level - Wrote some more comment blocks for most other 2d examples TODO: - [x] 2d/sprite_sheet, wasnt able to come up with something good yet - [x] all other example groups... Also: Please let me know if the commit style is okay, or to verbose. I could certainly squash these things, or add more details if needed. I also hope its okay to raise this PR this early, with just a few files changed. Took me long enough and I dont wanted to let it go to waste because I lost motivation to do the whole thing. Additionally I am somewhat uncertain over the style and contents of the commets. So let me know what you thing please.
This commit is contained in:
parent
7462f21be4
commit
1ba7429371
120 changed files with 425 additions and 177 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
//! Shows how to render a polygonal [`Mesh`], generated from a [`Quad`] primitive, in a 2D scene.
|
||||||
|
|
||||||
use bevy::{prelude::*, sprite::MaterialMesh2dBundle};
|
use bevy::{prelude::*, sprite::MaterialMesh2dBundle};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
//! This example shows how to manually render 2d items using "mid level render apis" with a custom
|
||||||
|
//! pipeline for 2d meshes.
|
||||||
|
//! It doesn't use the [`Material2d`] abstraction, but changes the vertex buffer to include vertex color.
|
||||||
|
//! Check out the "mesh2d" example for simpler / higher level 2d meshes.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core_pipeline::Transparent2d,
|
core_pipeline::Transparent2d,
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
@ -23,9 +28,6 @@ use bevy::{
|
||||||
utils::FloatOrd,
|
utils::FloatOrd,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// This example shows how to manually render 2d items using "mid level render apis" with a custom pipeline for 2d meshes
|
|
||||||
/// It doesn't use the [`Material2d`] abstraction, but changes the vertex buffer to include vertex color
|
|
||||||
/// Check out the "mesh2d" example for simpler / higher level 2d meshes
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Renders a 2D scene containing a single, moving sprite.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -25,6 +27,8 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
||||||
.insert(Direction::Up);
|
.insert(Direction::Up);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The sprite is animated by changing its translation depending on the time that has passed since
|
||||||
|
/// the last frame.
|
||||||
fn sprite_movement(time: Res<Time>, mut sprite_position: Query<(&mut Direction, &mut Transform)>) {
|
fn sprite_movement(time: Res<Time>, mut sprite_position: Query<(&mut Direction, &mut Transform)>) {
|
||||||
for (mut logo, mut transform) in sprite_position.iter_mut() {
|
for (mut logo, mut transform) in sprite_position.iter_mut() {
|
||||||
match *logo {
|
match *logo {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Demonstrates rotating entities in 2D using quaternions.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core::FixedTimestep,
|
core::FixedTimestep,
|
||||||
math::{const_vec2, Vec3Swizzles},
|
math::{const_vec2, Vec3Swizzles},
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Shows how to render simple primitive shapes with a single color.
|
||||||
|
|
||||||
use bevy::{prelude::*, sprite::MaterialMesh2dBundle};
|
use bevy::{prelude::*, sprite::MaterialMesh2dBundle};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Displays a single [`Sprite`], created from an image.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Displays a single [`Sprite`], created from an image, but flipped on one axis.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! Renders an animated sprite by loading all animation frames from a single image (a sprite sheet)
|
||||||
|
//! into a texture atlas, and changing the displayed image periodically.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
//! Shows text rendering with moving, rotating and scaling text.
|
||||||
|
//!
|
||||||
|
//! Note that this uses [`Text2dBundle`] to display text alongside your other entities in a 2D scene.
|
||||||
|
//!
|
||||||
|
//! For an example on how to render text as part of a user interface, independent from the world
|
||||||
|
//! viewport, you may want to look at `2d/contributors.rs` or `ui/text.rs`.
|
||||||
|
|
||||||
use bevy::{prelude::*, text::Text2dBounds};
|
use bevy::{prelude::*, text::Text2dBounds};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
//! In this example we generate a new texture atlas (sprite sheet) from a folder containing
|
||||||
|
//! individual sprites.
|
||||||
|
|
||||||
use bevy::{asset::LoadState, prelude::*};
|
use bevy::{asset::LoadState, prelude::*};
|
||||||
|
|
||||||
/// In this example we generate a new texture atlas (sprite sheet) from a folder containing
|
|
||||||
/// individual sprites
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.init_resource::<RpgSpriteHandles>()
|
.init_resource::<RpgSpriteHandles>()
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! A simple 3D scene with light shining over a cube sitting on a plane.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! Illustrates different lights of various types and colors, some static, some moving over
|
||||||
|
//! a simple scene.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Loads and renders a glTF file as a scene.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
|
//! This example shows how to configure Multi-Sample Anti-Aliasing. Setting the sample count higher
|
||||||
|
//! will result in smoother edges, but it will also increase the cost to render those edges. The
|
||||||
|
//! range should generally be somewhere between 1 (no multi sampling, but cheap) to 8 (crisp but
|
||||||
|
//! expensive).
|
||||||
|
//! Note that WGPU currently only supports 1 or 4 samples.
|
||||||
|
//! Ultimately we plan on supporting whatever is natively supported on a given device.
|
||||||
|
//! Check out [this issue](https://github.com/gfx-rs/wgpu/issues/1832) for more info.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
/// This example shows how to configure Multi-Sample Anti-Aliasing. Setting the sample count higher
|
|
||||||
/// will result in smoother edges, but it will also increase the cost to render those edges. The
|
|
||||||
/// range should generally be somewhere between 1 (no multi sampling, but cheap) to 8 (crisp but
|
|
||||||
/// expensive).
|
|
||||||
/// Note that WGPU currently only supports 1 or 4 samples.
|
|
||||||
/// Ultimately we plan on supporting whatever is natively supported on a given device.
|
|
||||||
/// Check out [this issue](https://github.com/gfx-rs/wgpu/issues/1832) for more info.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.insert_resource(Msaa { samples: 4 })
|
.insert_resource(Msaa { samples: 4 })
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Shows how to create a 3D orthographic view (for isometric-look games or CAD applications).
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
//! Illustrates how to create parent-child relationships between entities and how parent transforms
|
||||||
|
//! are propagated to their descendants.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
/// This example illustrates how to create parent->child relationships between entities how parent
|
|
||||||
/// transforms are propagated to their descendants
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.insert_resource(Msaa { samples: 4 })
|
.insert_resource(Msaa { samples: 4 })
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
//! This example shows how to configure Physically Based Rendering (PBR) parameters.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
/// This example shows how to configure Physically Based Rendering (PBR) parameters.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Shows how to render to a texture. Useful for mirrors, UI, or exporting images.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core_pipeline::{
|
core_pipeline::{
|
||||||
draw_3d_graph, node, AlphaMask3d, Opaque3d, RenderTargetClearColors, Transparent3d,
|
draw_3d_graph, node, AlphaMask3d, Opaque3d, RenderTargetClearColors, Transparent3d,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Demonstrates how shadow biases affect shadows in a 3d scene.
|
||||||
|
|
||||||
use bevy::{input::mouse::MouseMotion, prelude::*};
|
use bevy::{input::mouse::MouseMotion, prelude::*};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Demonstrates how to prevent meshes from casting/receiving shadows in a 3d scene.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
pbr::{NotShadowCaster, NotShadowReceiver},
|
pbr::{NotShadowCaster, NotShadowReceiver},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Demonstrates how lighting is affected by different radius of point lights.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
//! This example shows various ways to configure texture materials in 3D.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
/// This example shows various ways to configure texture materials in 3D
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! Shows how to render multiple passes to the same window, useful for rendering different views
|
||||||
|
//! or drawing an object on top regardless of depth.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core_pipeline::{draw_3d_graph, node, AlphaMask3d, Opaque3d, Transparent3d},
|
core_pipeline::{draw_3d_graph, node, AlphaMask3d, Opaque3d, Transparent3d},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
@ -68,6 +71,7 @@ fn extract_first_pass_camera_phases(
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// A node for the first pass camera that runs draw_3d_graph with this camera.
|
// A node for the first pass camera that runs draw_3d_graph with this camera.
|
||||||
struct FirstPassCameraDriver {
|
struct FirstPassCameraDriver {
|
||||||
query: QueryState<Entity, With<FirstPassCamera>>,
|
query: QueryState<Entity, With<FirstPassCamera>>,
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! Update a scene from a glTF file, either by spawning the scene as a child of another entity,
|
||||||
|
//! or by accessing the entities of the scene.
|
||||||
|
|
||||||
use bevy::{prelude::*, scene::InstanceId};
|
use bevy::{prelude::*, scene::InstanceId};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Illustrates the use of vertex colors.
|
||||||
|
|
||||||
use bevy::{prelude::*, render::mesh::VertexAttributeValues};
|
use bevy::{prelude::*, render::mesh::VertexAttributeValues};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Showcases wireframe rendering.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
pbr::wireframe::{Wireframe, WireframeConfig, WireframePlugin},
|
pbr::wireframe::{Wireframe, WireframeConfig, WireframePlugin},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
|
@ -241,14 +241,14 @@ Example | File | Description
|
||||||
|
|
||||||
Example | File | Description
|
Example | File | Description
|
||||||
--- | --- | ---
|
--- | --- | ---
|
||||||
`custom_vertex_attribute` | [`shader/custom_vertex_attribute.rs`](./shader/custom_vertex_attribute.rs) | Illustrates creating a custom shader material that reads a mesh's custom vertex attribute.
|
|
||||||
`shader_material` | [`shader/shader_material.rs`](./shader/shader_material.rs) | Illustrates creating a custom material and a shader that uses it
|
|
||||||
`shader_material_screenspace_texture` | [`shader/shader_material_screenspace_texture.rs`](./shader/shader_material_screenspace_texture.rs) | A custom shader sampling a texture with view-independent UV coordinates
|
|
||||||
`shader_material_glsl` | [`shader/shader_material_glsl.rs`](./shader/shader_material_glsl.rs) | A custom shader using the GLSL shading language.
|
|
||||||
`shader_instancing` | [`shader/shader_instancing.rs`](./shader/shader_instancing.rs) | A custom shader showing off rendering a mesh multiple times in one draw call.
|
|
||||||
`animate_shader` | [`shader/animate_shader.rs`](./shader/animate_shader.rs) | Shows how to pass changing data like the time since startup into a shader.
|
`animate_shader` | [`shader/animate_shader.rs`](./shader/animate_shader.rs) | Shows how to pass changing data like the time since startup into a shader.
|
||||||
`compute_shader_game_of_life` | [`shader/compute_shader_game_of_life.rs`](./shader/compute_shader_game_of_life.rs) | A compute shader simulating Conway's Game of Life
|
`compute_shader_game_of_life` | [`shader/compute_shader_game_of_life.rs`](./shader/compute_shader_game_of_life.rs) | A compute shader simulating Conway's Game of Life
|
||||||
|
`custom_vertex_attribute` | [`shader/custom_vertex_attribute.rs`](./shader/custom_vertex_attribute.rs) | Illustrates creating a custom shader material that reads a mesh's custom vertex attribute.
|
||||||
`shader_defs` | [`shader/shader_defs.rs`](./shader/shader_defs.rs) | Demonstrates creating a custom material that uses "shaders defs" (a tool to selectively toggle parts of a shader)
|
`shader_defs` | [`shader/shader_defs.rs`](./shader/shader_defs.rs) | Demonstrates creating a custom material that uses "shaders defs" (a tool to selectively toggle parts of a shader)
|
||||||
|
`shader_instancing` | [`shader/shader_instancing.rs`](./shader/shader_instancing.rs) | A custom shader showing off rendering a mesh multiple times in one draw call.
|
||||||
|
`shader_material` | [`shader/shader_material.rs`](./shader/shader_material.rs) | Illustrates creating a custom material and a shader that uses it
|
||||||
|
`shader_material_glsl` | [`shader/shader_material_glsl.rs`](./shader/shader_material_glsl.rs) | A custom shader using the GLSL shading language.
|
||||||
|
`shader_material_screenspace_texture` | [`shader/shader_material_screenspace_texture.rs`](./shader/shader_material_screenspace_texture.rs) | A custom shader sampling a texture with view-independent UV coordinates.
|
||||||
|
|
||||||
## Stress Tests
|
## Stress Tests
|
||||||
|
|
||||||
|
@ -279,14 +279,14 @@ Example | File | Description
|
||||||
|
|
||||||
Example | File | Description
|
Example | File | Description
|
||||||
--- | --- | ---
|
--- | --- | ---
|
||||||
`scene_viewer` | [`tools/scene_viewer.rs`](./tools/scene_viewer.rs) | A simple way to view glTF models with Bevy. Just run `cargo run --release --example scene_viewer -- /path/to/model.gltf#Scene0`, replacing the path as appropriate. With no arguments it will load the FieldHelmet glTF model from the repository assets subdirectory.
|
`scene_viewer` | [`tools/scene_viewer.rs`](./tools/scene_viewer.rs) | A simple way to view glTF models with Bevy. Just run `cargo run --release --example scene_viewer /path/to/model.gltf#Scene0`, replacing the path as appropriate. With no arguments it will load the FieldHelmet glTF model from the repository assets subdirectory.
|
||||||
|
|
||||||
## Transforms
|
## Transforms
|
||||||
|
|
||||||
Example | File | Description
|
Example | File | Description
|
||||||
--- | --- | ---
|
--- | --- | ---
|
||||||
`global_vs_local_translation` | [`transforms/global_vs_local_translation.rs`](./transforms/global_vs_local_translation.rs) | Illustrates the difference between direction of a translation in respect to local object or global object Transform
|
|
||||||
`3d_rotation` | [`transforms/3d_rotation.rs`](./transforms/3d_rotation.rs) | Illustrates how to (constantly) rotate an object around an axis
|
`3d_rotation` | [`transforms/3d_rotation.rs`](./transforms/3d_rotation.rs) | Illustrates how to (constantly) rotate an object around an axis
|
||||||
|
`global_vs_local_translation` | [`transforms/global_vs_local_translation.rs`](./transforms/global_vs_local_translation.rs) | Illustrates the difference between direction of a translation in respect to local object or global object Transform.
|
||||||
`scale` | [`transforms/scale.rs`](./transforms/scale.rs) | Illustrates how to scale an object in each direction
|
`scale` | [`transforms/scale.rs`](./transforms/scale.rs) | Illustrates how to scale an object in each direction
|
||||||
`transform` | [`transforms/transfrom.rs`](./transforms/transform.rs) | Shows multiple transformations of objects
|
`transform` | [`transforms/transfrom.rs`](./transforms/transform.rs) | Shows multiple transformations of objects
|
||||||
`translation` | [`transforms/translation.rs`](./transforms/translation.rs) | Illustrates how to move an object along an axis
|
`translation` | [`transforms/translation.rs`](./transforms/translation.rs) | Illustrates how to move an object along an axis
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Plays animations from a skinned glTF.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Create and play an animation defined by code that operates on the `Transform` component.
|
||||||
|
|
||||||
use std::f32::consts::{FRAC_PI_2, PI};
|
use std::f32::consts::{FRAC_PI_2, PI};
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! Skinned mesh example with mesh and joints data defined in code.
|
||||||
|
//! Example taken from <https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_019_SimpleSkin.md>
|
||||||
|
|
||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
|
@ -10,8 +13,6 @@ use bevy::{
|
||||||
};
|
};
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
/// Skinned mesh example with mesh and joints data defined in code.
|
|
||||||
/// Example taken from <https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_019_SimpleSkin.md>
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
|
//! Skinned mesh example with mesh and joints data loaded from a glTF file.
|
||||||
|
//! Example taken from <https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_019_SimpleSkin.md>
|
||||||
|
|
||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
|
|
||||||
use bevy::{pbr::AmbientLight, prelude::*, render::mesh::skinning::SkinnedMesh};
|
use bevy::{pbr::AmbientLight, prelude::*, render::mesh::skinning::SkinnedMesh};
|
||||||
|
|
||||||
/// Skinned mesh example with mesh and joints data loaded from a glTF file.
|
|
||||||
/// Example taken from <https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_019_SimpleSkin.md>
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
@ -27,7 +28,7 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
||||||
commands.spawn_scene(asset_server.load::<Scene, _>("models/SimpleSkin/SimpleSkin.gltf#Scene0"));
|
commands.spawn_scene(asset_server.load::<Scene, _>("models/SimpleSkin/SimpleSkin.gltf#Scene0"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The scene hierachy currently looks somewhat like this:
|
/// The scene hierarchy currently looks somewhat like this:
|
||||||
///
|
///
|
||||||
/// ```ignore
|
/// ```ignore
|
||||||
/// <Parent entity>
|
/// <Parent entity>
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
|
//! This example demonstrates you can create a custom runner (to update an app manually). It reads
|
||||||
|
//! lines from stdin and prints them from within the ecs.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use std::{io, io::BufRead};
|
use std::{io, io::BufRead};
|
||||||
|
|
||||||
struct Input(String);
|
struct Input(String);
|
||||||
|
|
||||||
/// This example demonstrates you can create a custom runner (to update an app manually). It reads
|
|
||||||
/// lines from stdin and prints them from within the ecs.
|
|
||||||
fn my_runner(mut app: App) {
|
fn my_runner(mut app: App) {
|
||||||
println!("Type stuff into the console");
|
println!("Type stuff into the console");
|
||||||
for line in io::stdin().lock().lines() {
|
for line in io::stdin().lock().lines() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! An example that shows how to handle drag and drop of files in an app.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! An empty application (does nothing)
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! An empty application with default plugins.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
use bevy::{app::ScheduleRunnerSettings, prelude::*, utils::Duration};
|
//! This example only enables a minimal set of plugins required for bevy to run.
|
||||||
|
//! You can also completely remove rendering / windowing Plugin code from bevy
|
||||||
|
//! by making your import look like this in your Cargo.toml.
|
||||||
|
//!
|
||||||
|
//! [dependencies]
|
||||||
|
//! bevy = { version = "*", default-features = false }
|
||||||
|
//! # replace "*" with the most recent version of bevy
|
||||||
|
|
||||||
// This example only enables a minimal set of plugins required for bevy to run.
|
use bevy::{app::ScheduleRunnerSettings, prelude::*, utils::Duration};
|
||||||
// You can also completely remove rendering / windowing Plugin code from bevy
|
|
||||||
// by making your import look like this in your Cargo.toml
|
|
||||||
//
|
|
||||||
// [dependencies]
|
|
||||||
// bevy = { version = "*", default-features = false }
|
|
||||||
// # replace "*" with the most recent version of bevy
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// this app runs once
|
// this app runs once
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! An application that runs with default plugins, but without an actual renderer.
|
||||||
|
//! This can be very useful for integration tests or CI.
|
||||||
|
|
||||||
use bevy::{prelude::*, render::settings::WgpuSettings};
|
use bevy::{prelude::*, render::settings::WgpuSettings};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
//! This example illustrates how to use logs in bevy.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
/// This example illustrates how to use logs in bevy
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
// Uncomment this to override the default log settings:
|
// Uncomment this to override the default log settings:
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
|
//! Demonstrates the creation and registration of a custom plugin.
|
||||||
|
//!
|
||||||
|
//! Plugins are the foundation of Bevy. They are scoped sets of components, resources, and systems
|
||||||
|
//! that provide a specific piece of functionality (generally the smaller the scope, the better).
|
||||||
|
//! This example illustrates how to create a simple plugin that prints out a message.
|
||||||
|
|
||||||
use bevy::{prelude::*, utils::Duration};
|
use bevy::{prelude::*, utils::Duration};
|
||||||
|
|
||||||
/// Plugins are the foundation of Bevy. They are scoped sets of components, resources, and systems
|
|
||||||
/// that provide a specific piece of functionality (generally the smaller the scope, the better).
|
|
||||||
/// This example illustrates how to create a simple plugin that prints out a message.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
|
//! Demonstrates the creation and registration of a custom plugin group.
|
||||||
|
//! [`PluginGroup`]s are a way to group sets of plugins that should be registered together.
|
||||||
|
|
||||||
use bevy::{app::PluginGroupBuilder, prelude::*};
|
use bevy::{app::PluginGroupBuilder, prelude::*};
|
||||||
|
|
||||||
/// [`PluginGroups`] are a way to group sets of plugins that should be registered together.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
// Two PluginGroups that are included with bevy are DefaultPlugins and MinimalPlugins
|
// Two PluginGroups that are included with bevy are DefaultPlugins and MinimalPlugins
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Shows how to return to the calling function after a windowed Bevy app has exited.
|
||||||
|
|
||||||
use bevy::{prelude::*, winit::WinitSettings};
|
use bevy::{prelude::*, winit::WinitSettings};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
//! This example illustrates how to customize the thread pool used internally (e.g. to only use a
|
||||||
|
//! certain number of threads).
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
/// This example illustrates how to customize the thread pool used internally (e.g. to only use a
|
|
||||||
/// certain number of threads).
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.insert_resource(DefaultTaskPoolOptions::with_num_threads(4))
|
.insert_resource(DefaultTaskPoolOptions::with_num_threads(4))
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Create an application without winit (runs single time, no event loop).
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use bevy::winit::WinitPlugin;
|
use bevy::winit::WinitPlugin;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
//! This example illustrates various ways to load assets.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
/// This example illustrates various ways to load assets
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.insert_resource(Msaa { samples: 4 })
|
.insert_resource(Msaa { samples: 4 })
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Implements loader for a custom asset type.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
asset::{AssetLoader, LoadContext, LoadedAsset},
|
asset::{AssetLoader, LoadContext, LoadedAsset},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
//! Implements a custom asset io loader.
|
||||||
|
//! An [`AssetIo`] is what the asset server uses to read the raw bytes of assets.
|
||||||
|
//! It does not know anything about the asset formats, only how to talk to the underlying storage.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
asset::{AssetIo, AssetIoError, Metadata},
|
asset::{AssetIo, AssetIoError, Metadata},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
|
//! Hot reloading allows you to modify assets files to be immediately reloaded while your game is
|
||||||
|
//! running. This lets you immediately see the results of your changes without restarting the game.
|
||||||
|
//! This example illustrates hot reloading mesh changes.
|
||||||
|
|
||||||
use bevy::{asset::AssetServerSettings, prelude::*};
|
use bevy::{asset::AssetServerSettings, prelude::*};
|
||||||
|
|
||||||
/// Hot reloading allows you to modify assets on disk and they will be "live reloaded" while your
|
|
||||||
/// game is running. This lets you immediately see the results of your changes without restarting
|
|
||||||
/// the game. This example illustrates hot reloading mesh changes.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
// Tell the asset server to watch for asset changes on disk:
|
// Tell the asset server to watch for asset changes on disk:
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! This example shows how to use the ECS and the [`AsyncComputeTaskPool`]
|
||||||
|
//! to spawn, poll, and complete tasks across systems and system ticks.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
prelude::*,
|
prelude::*,
|
||||||
tasks::{AsyncComputeTaskPool, Task},
|
tasks::{AsyncComputeTaskPool, Task},
|
||||||
|
@ -6,8 +9,6 @@ use futures_lite::future;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use std::time::{Duration, Instant};
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
/// This example shows how to use the ECS and the [`AsyncComputeTaskPool`]
|
|
||||||
/// to spawn, poll, and complete tasks across systems and system ticks.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.insert_resource(Msaa { samples: 4 })
|
.insert_resource(Msaa { samples: 4 })
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! How to use an external thread to run an infinite task and communicate with a channel.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
// Using crossbeam_channel instead of std as std `Receiver` is `!Sync`
|
// Using crossbeam_channel instead of std as std `Receiver` is `!Sync`
|
||||||
use crossbeam_channel::{bounded, Receiver};
|
use crossbeam_channel::{bounded, Receiver};
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
//! This example illustrates how to load and play an audio file.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
/// This example illustrates how to load and play an audio file
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
//! This example illustrates how to load and play an audio file, and control how it's played.
|
||||||
|
|
||||||
use bevy::{audio::AudioSink, prelude::*};
|
use bevy::{audio::AudioSink, prelude::*};
|
||||||
|
|
||||||
/// This example illustrates how to load and play an audio file, and control how it's played
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,22 +1,23 @@
|
||||||
|
//! This example illustrates how to create a custom diagnostic.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
diagnostic::{Diagnostic, DiagnosticId, Diagnostics, LogDiagnosticsPlugin},
|
diagnostic::{Diagnostic, DiagnosticId, Diagnostics, LogDiagnosticsPlugin},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// This example illustrates how to create a custom diagnostic
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
// The "print diagnostics" plugin is optional. It just visualizes our diagnostics in the
|
// The "print diagnostics" plugin is optional.
|
||||||
// console
|
// It just visualizes our diagnostics in the console.
|
||||||
.add_plugin(LogDiagnosticsPlugin::default())
|
.add_plugin(LogDiagnosticsPlugin::default())
|
||||||
.add_startup_system(setup_diagnostic_system)
|
.add_startup_system(setup_diagnostic_system)
|
||||||
.add_system(my_system)
|
.add_system(my_system)
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
// All diagnostics should have a unique DiagnosticId. for each new diagnostic, generate a new random
|
// All diagnostics should have a unique DiagnosticId.
|
||||||
// number
|
// For each new diagnostic, generate a new random number.
|
||||||
pub const SYSTEM_ITERATION_COUNT: DiagnosticId =
|
pub const SYSTEM_ITERATION_COUNT: DiagnosticId =
|
||||||
DiagnosticId::from_u128(337040787172757619024841343456040760896);
|
DiagnosticId::from_u128(337040787172757619024841343456040760896);
|
||||||
|
|
||||||
|
@ -31,6 +32,6 @@ fn setup_diagnostic_system(mut diagnostics: ResMut<Diagnostics>) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn my_system(mut diagnostics: ResMut<Diagnostics>) {
|
fn my_system(mut diagnostics: ResMut<Diagnostics>) {
|
||||||
// Add a measurement of 10.0 for our diagnostic each time this system runs
|
// Add a measurement of 10.0 for our diagnostic each time this system runs.
|
||||||
diagnostics.add_measurement(SYSTEM_ITERATION_COUNT, 10.0);
|
diagnostics.add_measurement(SYSTEM_ITERATION_COUNT, 10.0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Shows different built-in plugins that logs diagnostics, like frames per second (FPS), to the console.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin},
|
diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
//! This example illustrates how to react to component change.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
// This example illustrates how to react to component change
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,22 +1,23 @@
|
||||||
|
//! This example illustrates the usage of the `WorldQuery` derive macro, which allows
|
||||||
|
//! defining custom query and filter types.
|
||||||
|
//!
|
||||||
|
//! While regular tuple queries work great in most of simple scenarios, using custom queries
|
||||||
|
//! declared as named structs can bring the following advantages:
|
||||||
|
//! - They help to avoid destructuring or using `q.0, q.1, ...` access pattern.
|
||||||
|
//! - Adding, removing components or changing items order with structs greatly reduces maintenance
|
||||||
|
//! burden, as you don't need to update statements that destructure tuples, care about order
|
||||||
|
//! of elements, etc. Instead, you can just add or remove places where a certain element is used.
|
||||||
|
//! - Named structs enable the composition pattern, that makes query types easier to re-use.
|
||||||
|
//! - You can bypass the limit of 15 components that exists for query tuples.
|
||||||
|
//!
|
||||||
|
//! For more details on the `WorldQuery` derive macro, see the trait documentation.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
ecs::{component::Component, query::WorldQuery},
|
ecs::{component::Component, query::WorldQuery},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
};
|
};
|
||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
|
|
||||||
/// This examples illustrates the usage of the `WorldQuery` derive macro, which allows
|
|
||||||
/// defining custom query and filter types.
|
|
||||||
///
|
|
||||||
/// While regular tuple queries work great in most of simple scenarios, using custom queries
|
|
||||||
/// declared as named structs can bring the following advantages:
|
|
||||||
/// - They help to avoid destructuring or using `q.0, q.1, ...` access pattern.
|
|
||||||
/// - Adding, removing components or changing items order with structs greatly reduces maintenance
|
|
||||||
/// burden, as you don't need to update statements that destructure tuples, care about order
|
|
||||||
/// of elements, etc. Instead, you can just add or remove places where a certain element is used.
|
|
||||||
/// - Named structs enable the composition pattern, that makes query types easier to re-use.
|
|
||||||
/// - You can bypass the limit of 15 components that exists for query tuples.
|
|
||||||
///
|
|
||||||
/// For more details on the `WorldQuery` derive macro, see the trait documentation.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_startup_system(spawn)
|
.add_startup_system(spawn)
|
||||||
|
|
|
@ -1,3 +1,29 @@
|
||||||
|
//! This is a guided introduction to Bevy's "Entity Component System" (ECS)
|
||||||
|
//! All Bevy app logic is built using the ECS pattern, so definitely pay attention!
|
||||||
|
//!
|
||||||
|
//! Why ECS?
|
||||||
|
//! * Data oriented: Functionality is driven by data
|
||||||
|
//! * Clean Architecture: Loose coupling of functionality / prevents deeply nested inheritance
|
||||||
|
//! * High Performance: Massively parallel and cache friendly
|
||||||
|
//!
|
||||||
|
//! ECS Definitions:
|
||||||
|
//!
|
||||||
|
//! Component: just a normal Rust data type. generally scoped to a single piece of functionality
|
||||||
|
//! Examples: position, velocity, health, color, name
|
||||||
|
//!
|
||||||
|
//! Entity: a collection of components with a unique id
|
||||||
|
//! Examples: Entity1 { Name("Alice"), Position(0, 0) },
|
||||||
|
//! Entity2 { Name("Bill"), Position(10, 5) }
|
||||||
|
//!
|
||||||
|
//! Resource: a shared global piece of data
|
||||||
|
//! Examples: asset storage, events, system state
|
||||||
|
//!
|
||||||
|
//! System: runs logic on entities, components, and resources
|
||||||
|
//! Examples: move system, damage system
|
||||||
|
//!
|
||||||
|
//! Now that you know a little bit about ECS, lets look at some Bevy code!
|
||||||
|
//! We will now make a simple "game" to illustrate what Bevy's ECS looks like in practice.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
app::{AppExit, ScheduleRunnerPlugin, ScheduleRunnerSettings},
|
app::{AppExit, ScheduleRunnerPlugin, ScheduleRunnerSettings},
|
||||||
ecs::schedule::ReportExecutionOrderAmbiguities,
|
ecs::schedule::ReportExecutionOrderAmbiguities,
|
||||||
|
@ -7,32 +33,6 @@ use bevy::{
|
||||||
};
|
};
|
||||||
use rand::random;
|
use rand::random;
|
||||||
|
|
||||||
/// This is a guided introduction to Bevy's "Entity Component System" (ECS)
|
|
||||||
/// All Bevy app logic is built using the ECS pattern, so definitely pay attention!
|
|
||||||
///
|
|
||||||
/// Why ECS?
|
|
||||||
/// * Data oriented: Functionality is driven by data
|
|
||||||
/// * Clean Architecture: Loose coupling of functionality / prevents deeply nested inheritance
|
|
||||||
/// * High Performance: Massively parallel and cache friendly
|
|
||||||
///
|
|
||||||
/// ECS Definitions:
|
|
||||||
///
|
|
||||||
/// Component: just a normal Rust data type. generally scoped to a single piece of functionality
|
|
||||||
/// Examples: position, velocity, health, color, name
|
|
||||||
///
|
|
||||||
/// Entity: a collection of components with a unique id
|
|
||||||
/// Examples: Entity1 { Name("Alice"), Position(0, 0) }, Entity2 { Name("Bill"), Position(10, 5)
|
|
||||||
/// }
|
|
||||||
|
|
||||||
/// Resource: a shared global piece of data
|
|
||||||
/// Examples: asset storage, events, system state
|
|
||||||
///
|
|
||||||
/// System: runs logic on entities, components, and resources
|
|
||||||
/// Examples: move system, damage system
|
|
||||||
///
|
|
||||||
/// Now that you know a little bit about ECS, lets look at some Bevy code!
|
|
||||||
/// We will now make a simple "game" to illustrate what Bevy's ECS looks like in practice.
|
|
||||||
|
|
||||||
// COMPONENTS: Pieces of functionality we add to entities. These are just normal Rust data types
|
// COMPONENTS: Pieces of functionality we add to entities. These are just normal Rust data types
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
//! This example creates a new event, a system that triggers the event once per second,
|
||||||
|
//! and a system that prints a message whenever the event is received.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
/// This example creates a new event, a system that triggers the event once per second,
|
|
||||||
/// and a system that prints a message whenever the event is received.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Shows how to create systems that run every fixed timestep, rather than every tick.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core::{FixedTimestep, FixedTimesteps},
|
core::{FixedTimestep, FixedTimesteps},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
use bevy::{ecs::component::Component, prelude::*};
|
//! Generic types allow us to reuse logic across many related systems,
|
||||||
|
//! allowing us to specialize our function's behavior based on which type (or types) are passed in.
|
||||||
|
//!
|
||||||
|
//! This is commonly useful for working on related components or resources,
|
||||||
|
//! where we want to have unique types for querying purposes but want them all to work the same way.
|
||||||
|
//! This is particularly powerful when combined with user-defined traits to add more functionality to these related types.
|
||||||
|
//! Remember to insert a specialized copy of the system into the schedule for each type that you want to operate on!
|
||||||
|
//!
|
||||||
|
//! For more advice on working with generic types in Rust, check out <https://doc.rust-lang.org/book/ch10-01-syntax.html>
|
||||||
|
//! or <https://doc.rust-lang.org/rust-by-example/generics.html>
|
||||||
|
|
||||||
/// Generic types allow us to reuse logic across many related systems,
|
use bevy::{ecs::component::Component, prelude::*};
|
||||||
/// allowing us to specialize our function's behavior based on which type (or types) are passed in.
|
|
||||||
///
|
|
||||||
/// This is commonly useful for working on related components or resources,
|
|
||||||
/// where we want to have unique types for querying purposes but want them all to work the same way.
|
|
||||||
/// This is particularly powerful when combined with user-defined traits to add more functionality to these related types.
|
|
||||||
/// Remember to insert a specialized copy of the system into the schedule for each type that you want to operate on!
|
|
||||||
///
|
|
||||||
/// For more advice on working with generic types in Rust, check out <https://doc.rust-lang.org/book/ch10-01-syntax.html>
|
|
||||||
/// or <https://doc.rust-lang.org/rust-by-example/generics.html>
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
|
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
|
||||||
enum AppState {
|
enum AppState {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Creates a hierarchy of parents and children entities.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Shows how to iterate over combinations of query results.
|
||||||
|
|
||||||
use bevy::{core::FixedTimestep, pbr::AmbientLight, prelude::*, render::camera::Camera};
|
use bevy::{core::FixedTimestep, pbr::AmbientLight, prelude::*, render::camera::Camera};
|
||||||
use rand::{thread_rng, Rng};
|
use rand::{thread_rng, Rng};
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Illustrates parallel queries with `ParallelIterator`.
|
||||||
|
|
||||||
use bevy::{prelude::*, tasks::prelude::*};
|
use bevy::{prelude::*, tasks::prelude::*};
|
||||||
use rand::random;
|
use rand::random;
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// This example shows how you can know when a `Component` has been removed, so you can react to it.
|
//! This example shows how you can know when a `Component` has been removed, so you can react to it.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Demonstrates a startup system (one that runs once when the app starts up).
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
|
//! This example illustrates how to use [`States`] to control transitioning from a `Menu` state to
|
||||||
|
//! an `InGame` state.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
/// This example illustrates how to use [`States`] to control transitioning from a `Menu` state to
|
|
||||||
/// an `InGame` state.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! Illustrates how to make a single system from multiple functions running in sequence and sharing
|
||||||
|
//! their inputs and outputs.
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Shows how anonymous functions / closures can be used as systems.
|
||||||
|
|
||||||
use bevy::{log::LogPlugin, prelude::*};
|
use bevy::{log::LogPlugin, prelude::*};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
//! This example creates a custom [`SystemParam`] struct that counts the number of players.
|
||||||
|
|
||||||
use bevy::{ecs::system::SystemParam, prelude::*};
|
use bevy::{ecs::system::SystemParam, prelude::*};
|
||||||
|
|
||||||
/// This example creates a [`SystemParam`] struct that counts the number of players
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.insert_resource(PlayerCount(0))
|
.insert_resource(PlayerCount(0))
|
||||||
|
|
|
@ -1,3 +1,26 @@
|
||||||
|
//! Shows how systems with a similar purpose can be grouped into sets.
|
||||||
|
//!
|
||||||
|
//! ```none
|
||||||
|
//! Physics (Criteria: App has run < 1.0 seconds)
|
||||||
|
//! \--> update_velocity (via label PhysicsSystem::UpdateVelocity)
|
||||||
|
//! \--> movement (via label PhysicsSystem::Movement)
|
||||||
|
//! PostPhysics (Criteria: Resource `done` is false)
|
||||||
|
//! \--> collision || sfx
|
||||||
|
//! Exit (Criteria: Resource `done` is true)
|
||||||
|
//! \--> exit
|
||||||
|
//! ```
|
||||||
|
//!
|
||||||
|
//! The `Physics` label represents a [`SystemSet`] containing two systems.
|
||||||
|
//! This set's criteria is to stop after a second has elapsed.
|
||||||
|
//! The two systems (`update_velocity`, `movement`) run in a specified order.
|
||||||
|
//!
|
||||||
|
//! Another label `PostPhysics` uses run criteria to only run after `Physics` has finished.
|
||||||
|
//! This set's criteria is to run only when _not done_, as specified via a resource.
|
||||||
|
//! The two systems here (collision, sfx) are not specified to run in any order, and the actual
|
||||||
|
//! ordering can then change between invocations.
|
||||||
|
//!
|
||||||
|
//! Lastly a system with run criteria _done_ is used to exit the app.
|
||||||
|
|
||||||
use bevy::{app::AppExit, ecs::schedule::ShouldRun, prelude::*};
|
use bevy::{app::AppExit, ecs::schedule::ShouldRun, prelude::*};
|
||||||
|
|
||||||
/// A [`SystemLabel`] can be applied as a label to systems and system sets,
|
/// A [`SystemLabel`] can be applied as a label to systems and system sets,
|
||||||
|
@ -16,28 +39,6 @@ struct PostPhysics;
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct Done(bool);
|
struct Done(bool);
|
||||||
|
|
||||||
/// This example realizes the following scheme:
|
|
||||||
///
|
|
||||||
/// ```none
|
|
||||||
/// Physics (Criteria: App has run < 1.0 seconds)
|
|
||||||
/// \--> update_velocity (via label PhysicsSystem::UpdateVelocity)
|
|
||||||
/// \--> movement (via label PhysicsSystem::Movement)
|
|
||||||
/// PostPhysics (Criteria: Resource `done` is false)
|
|
||||||
/// \--> collision || sfx
|
|
||||||
/// Exit (Criteria: Resource `done` is true)
|
|
||||||
/// \--> exit
|
|
||||||
/// ```
|
|
||||||
///
|
|
||||||
/// The `Physics` label represents a [`SystemSet`] containing two systems.
|
|
||||||
/// This set's criteria is to stop after a second has elapsed.
|
|
||||||
/// The two systems (`update_velocity`, `movement`) run in a specified order.
|
|
||||||
///
|
|
||||||
/// Another label `PostPhysics` uses run criteria to only run after `Physics` has finished.
|
|
||||||
/// This set's criteria is to run only when _not done_, as specified via a resource.
|
|
||||||
/// The two systems here (collision, sfx) are not specified to run in any order, and the actual
|
|
||||||
/// ordering can then change between invocations.
|
|
||||||
///
|
|
||||||
/// Lastly a system with run criterion _done_ is used to exit the app.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Illustrates how `Timer`s can be used both as resources and components.
|
||||||
|
|
||||||
use bevy::{log::info, prelude::*};
|
use bevy::{log::info, prelude::*};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Eat the cakes. Eat them all. An example 3D game.
|
||||||
|
|
||||||
use bevy::{core::FixedTimestep, ecs::schedule::SystemSet, prelude::*, render::camera::Camera3d};
|
use bevy::{core::FixedTimestep, ecs::schedule::SystemSet, prelude::*, render::camera::Camera3d};
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
|
|
||||||
|
@ -268,12 +270,12 @@ fn focus_camera(
|
||||||
.translation
|
.translation
|
||||||
.lerp(bonus_transform.translation, 0.5);
|
.lerp(bonus_transform.translation, 0.5);
|
||||||
}
|
}
|
||||||
// otherwise, if there is only a player, target the player
|
// otherwise, if there is only a player, target the player
|
||||||
} else if let Some(player_entity) = game.player.entity {
|
} else if let Some(player_entity) = game.player.entity {
|
||||||
if let Ok(player_transform) = transforms.p1().get(player_entity) {
|
if let Ok(player_transform) = transforms.p1().get(player_entity) {
|
||||||
game.camera_should_focus = player_transform.translation;
|
game.camera_should_focus = player_transform.translation;
|
||||||
}
|
}
|
||||||
// otherwise, target the middle
|
// otherwise, target the middle
|
||||||
} else {
|
} else {
|
||||||
game.camera_should_focus = Vec3::from(RESET_FOCUS);
|
game.camera_should_focus = Vec3::from(RESET_FOCUS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
//! A simplified implementation of the classic game "Breakout"
|
//! A simplified implementation of the classic game "Breakout".
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core::FixedTimestep,
|
core::FixedTimestep,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! This example displays each contributor to the bevy source code as a bouncing bevy-ball.
|
||||||
|
|
||||||
use bevy::{prelude::*, utils::HashSet};
|
use bevy::{prelude::*, utils::HashSet};
|
||||||
use rand::{prelude::SliceRandom, Rng};
|
use rand::{prelude::SliceRandom, Rng};
|
||||||
use std::{
|
use std::{
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
use bevy::prelude::*;
|
//! This example will display a simple menu using Bevy UI where you can start a new game,
|
||||||
|
//! change some settings or quit. There is no actual game, it will just display the current
|
||||||
|
//! settings for 5 seconds before going back to the menu.
|
||||||
|
|
||||||
// This example will display a simple menu using Bevy UI where you can start a new game,
|
use bevy::prelude::*;
|
||||||
// change some settings or quit. There is no actual game, it will just display the current
|
|
||||||
// settings for 5 seconds before going back to the menu.
|
|
||||||
|
|
||||||
const TEXT_COLOR: Color = Color::rgb(0.9, 0.9, 0.9);
|
const TEXT_COLOR: Color = Color::rgb(0.9, 0.9, 0.9);
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Prints out all chars as they are inputted.
|
||||||
|
|
||||||
use bevy::{prelude::*, window::ReceivedCharacter};
|
use bevy::{prelude::*, window::ReceivedCharacter};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Shows handling of gamepad input, connections, and disconnections.
|
||||||
|
|
||||||
use bevy::{input::gamepad::GamepadButton, prelude::*};
|
use bevy::{input::gamepad::GamepadButton, prelude::*};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Iterates and prints gamepad input and connection events.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
input::gamepad::{GamepadEvent, GamepadEventType},
|
input::gamepad::{GamepadEvent, GamepadEventType},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Demonstrates handling a key press/release.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
input::{keyboard::KeyCode, Input},
|
input::{keyboard::KeyCode, Input},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Prints out all keyboard events.
|
||||||
|
|
||||||
use bevy::{input::keyboard::KeyboardInput, prelude::*};
|
use bevy::{input::keyboard::KeyboardInput, prelude::*};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Demonstrates using key modifiers (ctrl, shift).
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
input::{keyboard::KeyCode, Input},
|
input::{keyboard::KeyCode, Input},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Demonstrates how to grab and hide the mouse cursor.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Prints mouse button events.
|
||||||
|
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Prints all mouse events to the console.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
input::mouse::{MouseButtonInput, MouseMotion, MouseWheel},
|
input::mouse::{MouseButtonInput, MouseMotion, MouseWheel},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Displays touch presses, releases, and cancels.
|
||||||
|
|
||||||
use bevy::{input::touch::*, prelude::*};
|
use bevy::{input::touch::*, prelude::*};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Prints out all touch inputs.
|
||||||
|
|
||||||
use bevy::{input::touch::*, prelude::*};
|
use bevy::{input::touch::*, prelude::*};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
|
//! Demonstrates how reflection is used with generic Rust types.
|
||||||
|
|
||||||
use bevy::{prelude::*, reflect::TypeRegistry};
|
use bevy::{prelude::*, reflect::TypeRegistry};
|
||||||
use std::any::TypeId;
|
use std::any::TypeId;
|
||||||
|
|
||||||
/// You must manually register each instance of a generic type
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
// You must manually register each instance of a generic type
|
||||||
.register_type::<MyType<u32>>()
|
.register_type::<MyType<u32>>()
|
||||||
.add_startup_system(setup)
|
.add_startup_system(setup)
|
||||||
.run();
|
.run();
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
//! Illustrates how "reflection" works in Bevy.
|
||||||
|
//!
|
||||||
|
//! Reflection provides a way to dynamically interact with Rust types, such as accessing fields
|
||||||
|
//! by their string name. Reflection is a core part of Bevy and enables a number of interesting
|
||||||
|
//! features (like scenes).
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
prelude::*,
|
prelude::*,
|
||||||
reflect::{
|
reflect::{
|
||||||
|
@ -7,9 +13,6 @@ use bevy::{
|
||||||
};
|
};
|
||||||
use serde::de::DeserializeSeed;
|
use serde::de::DeserializeSeed;
|
||||||
|
|
||||||
/// This example illustrates how "reflection" works in Bevy. Reflection provide a way to dynamically
|
|
||||||
/// interact with Rust types, such as accessing fields by their string name. Reflection is a core
|
|
||||||
/// part of Bevy and enables a number of interesting scenarios (like scenes).
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! This example illustrates how reflection works for simple data structures, like
|
||||||
|
//! structs, tuples and vectors.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
prelude::*,
|
prelude::*,
|
||||||
reflect::{DynamicList, ReflectRef},
|
reflect::{DynamicList, ReflectRef},
|
||||||
|
@ -5,7 +8,6 @@ use bevy::{
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
/// This example illustrates the various reflection types available
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Allows reflection with trait objects.
|
||||||
|
|
||||||
use bevy::{prelude::*, reflect::TypeRegistry};
|
use bevy::{prelude::*, reflect::TypeRegistry};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
//! This example illustrates loading scenes from files.
|
||||||
|
|
||||||
use bevy::{prelude::*, reflect::TypeRegistry, utils::Duration};
|
use bevy::{prelude::*, reflect::TypeRegistry, utils::Duration};
|
||||||
|
|
||||||
/// This example illustrates loading and saving scenes from files
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! Shows how to pass changing data like the time since startup into a shader, using a custom
|
||||||
|
//! specialized pipeline.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core_pipeline::Transparent3d,
|
core_pipeline::Transparent3d,
|
||||||
ecs::system::{lifetimeless::SRes, SystemParamItem},
|
ecs::system::{lifetimeless::SRes, SystemParamItem},
|
||||||
|
@ -244,6 +247,7 @@ type DrawCustom = (
|
||||||
);
|
);
|
||||||
|
|
||||||
struct SetTimeBindGroup<const I: usize>;
|
struct SetTimeBindGroup<const I: usize>;
|
||||||
|
|
||||||
impl<const I: usize> EntityRenderCommand for SetTimeBindGroup<I> {
|
impl<const I: usize> EntityRenderCommand for SetTimeBindGroup<I> {
|
||||||
type Param = SRes<TimeMeta>;
|
type Param = SRes<TimeMeta>;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
//! A compute shader simulating Conway's Game of Life.
|
||||||
|
//!
|
||||||
|
//! Compute shaders use the GPU for computing arbitrary information, that may be independent of what
|
||||||
|
//! is rendered to the screen.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core_pipeline::node::MAIN_PASS_DEPENDENCIES,
|
core_pipeline::node::MAIN_PASS_DEPENDENCIES,
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
@ -77,6 +82,7 @@ impl Plugin for GameOfLifeComputePlugin {
|
||||||
|
|
||||||
#[derive(Deref)]
|
#[derive(Deref)]
|
||||||
struct GameOfLifeImage(Handle<Image>);
|
struct GameOfLifeImage(Handle<Image>);
|
||||||
|
|
||||||
struct GameOfLifeImageBindGroup(BindGroup);
|
struct GameOfLifeImageBindGroup(BindGroup);
|
||||||
|
|
||||||
fn extract_game_of_life_image(mut commands: Commands, image: Res<GameOfLifeImage>) {
|
fn extract_game_of_life_image(mut commands: Commands, image: Res<GameOfLifeImage>) {
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Illustrates creating a custom shader material that reads a mesh's custom vertex attribute.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
ecs::system::{lifetimeless::SRes, SystemParamItem},
|
ecs::system::{lifetimeless::SRes, SystemParamItem},
|
||||||
pbr::MaterialPipeline,
|
pbr::MaterialPipeline,
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
//! Demonstrates creating a custom material that uses "shaders defs", a tool that enables
|
||||||
|
//! conditional compilation in shaders.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core_pipeline::Transparent3d,
|
core_pipeline::Transparent3d,
|
||||||
pbr::{
|
pbr::{
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! A custom shader showing off rendering a mesh multiple times in one draw call.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core_pipeline::Transparent3d,
|
core_pipeline::Transparent3d,
|
||||||
ecs::system::{lifetimeless::*, SystemParamItem},
|
ecs::system::{lifetimeless::*, SystemParamItem},
|
||||||
|
@ -64,6 +66,7 @@ fn setup(mut commands: Commands, mut meshes: ResMut<Assets<Mesh>>) {
|
||||||
|
|
||||||
#[derive(Component, Deref)]
|
#[derive(Component, Deref)]
|
||||||
struct InstanceMaterialData(Vec<InstanceData>);
|
struct InstanceMaterialData(Vec<InstanceData>);
|
||||||
|
|
||||||
impl ExtractComponent for InstanceMaterialData {
|
impl ExtractComponent for InstanceMaterialData {
|
||||||
type Query = &'static InstanceMaterialData;
|
type Query = &'static InstanceMaterialData;
|
||||||
type Filter = ();
|
type Filter = ();
|
||||||
|
@ -226,6 +229,7 @@ type DrawCustom = (
|
||||||
);
|
);
|
||||||
|
|
||||||
pub struct DrawMeshInstanced;
|
pub struct DrawMeshInstanced;
|
||||||
|
|
||||||
impl EntityRenderCommand for DrawMeshInstanced {
|
impl EntityRenderCommand for DrawMeshInstanced {
|
||||||
type Param = (
|
type Param = (
|
||||||
SRes<RenderAssets<Mesh>>,
|
SRes<RenderAssets<Mesh>>,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! Illustrates creating a custom material and a shader that uses it.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
ecs::system::{lifetimeless::SRes, SystemParamItem},
|
ecs::system::{lifetimeless::SRes, SystemParamItem},
|
||||||
pbr::MaterialPipeline,
|
pbr::MaterialPipeline,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! A custom shader using the GLSL shading language.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
ecs::system::{lifetimeless::SRes, SystemParamItem},
|
ecs::system::{lifetimeless::SRes, SystemParamItem},
|
||||||
pbr::{MaterialPipeline, SpecializedMaterial},
|
pbr::{MaterialPipeline, SpecializedMaterial},
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
//! A custom shader sampling a texture with view-independent UV coordinates.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
ecs::system::{lifetimeless::SRes, SystemParamItem},
|
ecs::system::{lifetimeless::SRes, SystemParamItem},
|
||||||
pbr::MaterialPipeline,
|
pbr::MaterialPipeline,
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
//! This example provides a 2D benchmark.
|
||||||
|
//!
|
||||||
|
//! Usage: spawn more entities by clicking on the screen.
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
core::FixedTimestep,
|
core::FixedTimestep,
|
||||||
diagnostic::{Diagnostics, FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin},
|
diagnostic::{Diagnostics, FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin},
|
||||||
|
@ -22,9 +26,6 @@ struct Bird {
|
||||||
velocity: Vec3,
|
velocity: Vec3,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This example provides a 2D benchmark.
|
|
||||||
///
|
|
||||||
/// Usage: spawn more entities by clicking on the screen.
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.insert_resource(WindowDescriptor {
|
.insert_resource(WindowDescriptor {
|
||||||
|
|
|
@ -1,8 +1,21 @@
|
||||||
|
//! Simple benchmark to test per-entity draw overhead.
|
||||||
|
//!
|
||||||
|
//! To measure performance realistically, be sure to run this in release mode.
|
||||||
|
//! `cargo run --example many_cubes --release`
|
||||||
|
//!
|
||||||
|
//! By default, this arranges the meshes in a cubical pattern, where the number of visible meshes
|
||||||
|
//! varies with the viewing angle. You can choose to run the demo with a spherical pattern that
|
||||||
|
//! distributes the meshes evenly.
|
||||||
|
//!
|
||||||
|
//! To start the demo using the spherical layout run
|
||||||
|
//! `cargo run --example many_cubes --release sphere`
|
||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin},
|
diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin},
|
||||||
math::{DVec2, DVec3},
|
math::{DVec2, DVec3},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
App::new()
|
App::new()
|
||||||
.add_plugins(DefaultPlugins)
|
.add_plugins(DefaultPlugins)
|
||||||
|
@ -119,6 +132,7 @@ fn setup(
|
||||||
// http://extremelearning.com.au/how-to-evenly-distribute-points-on-a-sphere-more-effectively-than-the-canonical-fibonacci-lattice/
|
// http://extremelearning.com.au/how-to-evenly-distribute-points-on-a-sphere-more-effectively-than-the-canonical-fibonacci-lattice/
|
||||||
// for details.
|
// for details.
|
||||||
const EPSILON: f64 = 0.36;
|
const EPSILON: f64 = 0.36;
|
||||||
|
|
||||||
fn fibonacci_spiral_on_sphere(golden_ratio: f64, i: usize, n: usize) -> DVec2 {
|
fn fibonacci_spiral_on_sphere(golden_ratio: f64, i: usize, n: usize) -> DVec2 {
|
||||||
DVec2::new(
|
DVec2::new(
|
||||||
2.0 * std::f64::consts::PI * (i as f64 / golden_ratio),
|
2.0 * std::f64::consts::PI * (i as f64 / golden_ratio),
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue